s3:dir - Map wire offsets to native directory cookies.
authorJeremy Allison <jra@samba.org>
Sat, 11 Jan 2014 23:04:38 +0000 (15:04 -0800)
committerAndreas Schneider <asn@samba.org>
Wed, 15 Jan 2014 08:45:10 +0000 (09:45 +0100)
Take care of the special offsets.

https://bugzilla.samba.org/show_bug.cgi?id=2662

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/smbd/dir.c

index 13e2090d14f4343c9a748aab1b03927a5256bf0a..980ca5832eabe2e8b72bcd2fe5fd4ed2675c4e5f 100644 (file)
@@ -937,6 +937,22 @@ bool dptr_fill(struct smbd_server_connection *sconn,
        return(True);
 }
 
+/****************************************************************************
+ Map a 32-bit wire cookie to a native directory offset.
+****************************************************************************/
+
+static long map_wire_to_dir_offset(struct dptr_struct *dptr, uint32_t wire_offset)
+{
+       if (wire_offset == WIRE_END_OF_DIRECTORY_OFFSET) {
+               return END_OF_DIRECTORY_OFFSET;
+       } else if(wire_offset == WIRE_START_OF_DIRECTORY_OFFSET) {
+               return START_OF_DIRECTORY_OFFSET;
+       } else if (wire_offset == WIRE_DOT_DOT_DIRECTORY_OFFSET) {
+               return DOT_DOT_DIRECTORY_OFFSET;
+       }
+       return (long)wire_offset;
+}
+
 /****************************************************************************
  Fetch the dir ptr and seek it given the 5 byte server field.
 ****************************************************************************/
@@ -955,11 +971,7 @@ struct dptr_struct *dptr_fetch(struct smbd_server_connection *sconn,
        }
        *num = key;
        wire_offset = IVAL(buf,1);
-       if (wire_offset == (uint32_t)-1) {
-               seekoff = END_OF_DIRECTORY_OFFSET;
-       } else {
-               seekoff = (long)wire_offset;
-       }
+       seekoff = map_wire_to_dir_offset(dptr, wire_offset);
        SeekDir(dptr->dir_hnd,seekoff);
        DEBUG(3,("fetching dirptr %d for path %s at offset %d\n",
                key, dptr->path, (int)seekoff));