/*
- * $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>
#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
/*
* $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
/*
- * $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>
}
}
+/* -------------------
+ 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)
{
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;
}
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;
}
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;
}