]> arthur.barton.de Git - netatalk.git/commitdiff
guard against confused DB returning junk values
authordidg <didg>
Sat, 28 Nov 2009 13:09:25 +0000 (13:09 +0000)
committerdidg <didg>
Sat, 28 Nov 2009 13:09:25 +0000 (13:09 +0000)
include/atalk/cnid.h
include/atalk/cnid_private.h
libatalk/cnid/cnid.c

index ee21c346962da9047f0ea62f83ad7af465ec4f44..6fdef75d636ad04e583fc7974bd75663914f6e74 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: cnid.h,v 1.13 2009-11-24 12:18:19 didg Exp $
+ * $Id: cnid.h,v 1.14 2009-11-28 13:09:25 didg Exp $
  *
  * Copyright (c) 2003 the Netatalk Team
  * Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
@@ -37,6 +37,8 @@
 #define CNID_FLAG_INODE        0x80     /* in cnid_add the inode is authoritative */
 
 #define CNID_INVALID   0
+/* first valid ID */
+#define CNID_START     17
 
 #define CNID_ERR_PARAM 0x80000001
 #define CNID_ERR_PATH  0x80000002
@@ -119,7 +121,10 @@ void cnid_close(struct _cnid_db *db);
 
 /*
  * $Log: cnid.h,v $
- * Revision 1.13  2009-11-24 12:18:19  didg
+ * Revision 1.14  2009-11-28 13:09:25  didg
+ * guard against confused DB returning junk values
+ *
+ * Revision 1.13  2009/11/24 12:18:19  didg
  * add a flag parameter to cnid open functions
  *
  * Revision 1.12  2005/09/07 15:23:21  didg
index b6025963b1c131649130e499b144bd7cea9a5c29..6525ce4898c63508bb6c8cb97979cfea61800fdd 100644 (file)
@@ -29,8 +29,6 @@
 #define CNID_NAME_OFS            (CNID_DID_OFS + CNID_DID_LEN)
 #define CNID_HEADER_LEN          (CNID_NAME_OFS)
 
-#define CNID_START               17
-
 #define CNIDFLAG_ROOTINFO_RO     (1 << 0)
 #define CNIDFLAG_DB_RO           (1 << 1)
 
index 86b9594fbed6b59fbb9330ab18605b00034675c3..1391a8111c3e484422c32dddf12aee44453719ac 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: cnid.c,v 1.10 2009-11-24 15:44:56 didg Exp $
+ * $Id: cnid.c,v 1.11 2009-11-28 13:09:26 didg Exp $
  *
  * Copyright (c) 2003 the Netatalk Team
  * Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
@@ -176,6 +176,23 @@ static void unblock_signal(u_int32_t flags)
     }
 }
 
+/* ------------------- 
+  protect against bogus value from the DB.
+  adddir really doesn't like 2
+*/
+static cnid_t valide(cnid_t id)
+{
+  if (id < CNID_START) {
+    static int err = 0;
+    if (!err) {
+        err = 1;
+        LOG(log_error, logtype_afpd, "Error: Invalid cnid, corrupted DB?");
+    }
+    return CNID_INVALID;
+  }
+  return id;
+}
+
 /* Closes CNID database. Currently it's just a wrapper around db->cnid_close(). */
 void cnid_close(struct _cnid_db *db)
 {
@@ -199,7 +216,7 @@ cnid_t cnid_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
 cnid_t ret;
 
     block_signal(cdb->flags);
-    ret = cdb->cnid_add(cdb, st, did, name, len, hint);
+    ret = valide(cdb->cnid_add(cdb, st, did, name, len, hint));
     unblock_signal(cdb->flags);
     return ret;
 }
@@ -222,7 +239,7 @@ cnid_t cnid_get(struct _cnid_db *cdb, const cnid_t did, char *name,const size_t
 cnid_t ret;
 
     block_signal(cdb->flags);
-    ret = cdb->cnid_get(cdb, did, name, len);
+    ret = valide(cdb->cnid_get(cdb, did, name, len));
     unblock_signal(cdb->flags);
     return ret;
 }
@@ -255,7 +272,7 @@ cnid_t cnid_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t did
 cnid_t ret;
 
     block_signal(cdb->flags);
-    ret = cdb->cnid_lookup(cdb, st, did, name, len);
+    ret = valide(cdb->cnid_lookup(cdb, st, did, name, len));
     unblock_signal(cdb->flags);
     return ret;
 }