]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/file.c
Fix a problem where afp_deleteid() would delete the parent directory,
[netatalk.git] / etc / afpd / file.c
index 5a76ecd9ea668103057b76deab81b631b3050be4..0f3280fe814b64ccfda02c1038862be305bc1ed3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: file.c,v 1.35 2002-01-04 04:45:47 sibaz Exp $
+ * $Id: file.c,v 1.40 2002-03-05 02:04:46 jmarcus Exp $
  *
  * Copyright (c) 1990,1993 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -89,11 +89,11 @@ char *strchr (), *strrchr ();
  */
 
 const u_char ufinderi[] = {
-    'T', 'E', 'X', 'T', 'U', 'N', 'I', 'X',
-    0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0,
-    0, 0, 0, 0, 0, 0, 0, 0
-};
+                              'T', 'E', 'X', 'T', 'U', 'N', 'I', 'X',
+                              0, 0, 0, 0, 0, 0, 0, 0,
+                              0, 0, 0, 0, 0, 0, 0, 0,
+                              0, 0, 0, 0, 0, 0, 0, 0
+                          };
 
 int getfilparams(struct vol *vol,
                  u_int16_t bitmap,
@@ -224,6 +224,19 @@ int getfilparams(struct vol *vol,
 #ifdef CNID_DB
             aint = cnid_add(vol->v_db, st, dir->d_did, upath,
                             strlen(upath), aint);
+            /* Throw errors if cnid_add fails. */
+            if (aint == CNID_INVALID) {
+                switch (errno) {
+                case CNID_ERR_PARAM:
+                    LOG(log_error, logtype_default, "getfilparams: Incorrect parameters passed to cnid_add");
+                    return(AFPERR_PARAM);
+                case CNID_ERR_PATH:
+                    return(AFPERR_PARAM);
+                case CNID_ERR_DB:
+                case CNID_ERR_MAX:
+                    return(AFPERR_MISC);
+                }
+            }
 #endif /* CNID_DB */
 
             if (aint == 0) {
@@ -1354,7 +1367,7 @@ int               ibuflen, *rbuflen;
     }
 #endif /* AD_VERSION > AD_VERSION1 */
 
-    if (id = cnid_add(vol->v_db, &st, did, upath, len, id)) {
+    if (id = cnid_add(vol->v_db, &st, did, upath, len, id) != CNID_INVALID) {
         memcpy(rbuf, &id, sizeof(id));
         *rbuflen = sizeof(id);
         return AFP_OK;
@@ -1373,7 +1386,7 @@ int               ibuflen, *rbuflen;
         return AFPERR_ACCESS;
         break;
     default:
-        LOG(log_error, logtype_default, "afp_createid: cnid_add: %m");
+        LOG(log_error, logtype_default, "afp_createid: cnid_add: %s", strerror(errno));
         return AFPERR_PARAM;
     }
 }
@@ -1461,6 +1474,7 @@ int               ibuflen, *rbuflen;
     char                *upath;
     int                 err;
     cnid_t             id;
+    cnid_t             fileid;
     u_short            vid;
 
 #ifdef DEBUG
@@ -1482,7 +1496,8 @@ int               ibuflen, *rbuflen;
 
     memcpy(&id, ibuf, sizeof( id ));
     ibuf += sizeof(id);
-
+    fileid = id;
+    
     if ((upath = cnid_resolve(vol->v_db, &id)) == NULL) {
         return AFPERR_NOID;
     }
@@ -1510,7 +1525,7 @@ int               ibuflen, *rbuflen;
     if (S_ISDIR(st.st_mode))
         return AFPERR_BADTYPE;
 
-    if (cnid_delete(vol->v_db, id)) {
+    if (cnid_delete(vol->v_db, fileid)) {
         switch (errno) {
         case EROFS:
             return AFPERR_VLOCK;
@@ -1679,7 +1694,7 @@ int               ibuflen, *rbuflen;
         case EPERM:
         case EACCES:
             err = AFPERR_ACCESS;
-                       break;
+            break;
         default:
             err = AFPERR_PARAM;
         }
@@ -1692,7 +1707,7 @@ int               ibuflen, *rbuflen;
         case EPERM:
         case EACCES:
             err = AFPERR_ACCESS;
-                       break;
+            break;
         default:
             err = AFPERR_PARAM;
         }