Dell - Internal Use - Confidential  

> On Wed, 19 Sep 2018 12:33:37 +0100
> "Burton, Ross" <ross.bur...@intel.com> wrote:
>
> > Is anyone actually writing a patch?
>
> I have a tentative fix for this checked into master, I don't know
> whether it actually works because I don't have any inodes over 2^63.
>
> It doesn't seem to have *broken* anything, though in casual testing.
> It's not carefully tested.
> 
> -s

My sincerest apologies, my "maths" failed me.  Number was correct, bound were 
wrong.  Any inodes above 0x7FFF FFFF (2147483647) fail... HOWEVER that's not 
64-bits, that's 32-bits! (DUH JACK!)

Okay, so I found the problem, and I have a patch for it.  Throughout the 
pseudo_db.c code, the handling of the msg->ino objects is not consistent.  Many 
get passed to the sqlite3_bind_int64 function, but NOT ALL.  9 instances in the 
code, including all of them in the xattr code use only sqlite3_bind_int which 
truncates the integers to signed 32-bits.

Fixing those 9 entries resolves the issue. Patch follows:

Index: git/pseudo_db.c
===================================================================
--- git.orig/pseudo_db.c
+++ git/pseudo_db.c
@@ -1512,9 +1512,9 @@ pdb_clear_xattrs(pseudo_msg_t *msg) {
                }
        }
        sqlite3_bind_int(delete, 1, msg->dev);
-       sqlite3_bind_int(delete, 2, msg->ino);
+       sqlite3_bind_int64(delete, 2, msg->ino);
        sqlite3_bind_int(delete, 3, msg->dev);
-       sqlite3_bind_int(delete, 4, msg->ino);
+       sqlite3_bind_int64(delete, 4, msg->ino);
        rc = sqlite3_step(delete);
        if (rc != SQLITE_DONE) {
                dberr(file_db, "delete of unused xattrs may have failed");
@@ -1549,9 +1549,9 @@ pdb_copy_xattrs(pseudo_msg_t *oldmsg, ps
                }
        }
        sqlite3_bind_int(copy, 1, msg->dev);
-       sqlite3_bind_int(copy, 2, msg->ino);
+       sqlite3_bind_int64(copy, 2, msg->ino);
        sqlite3_bind_int(copy, 3, oldmsg->dev);
-       sqlite3_bind_int(copy, 4, oldmsg->ino);
+       sqlite3_bind_int64(copy, 4, oldmsg->ino);
        rc = sqlite3_step(copy);
        if (rc != SQLITE_DONE) {
                dberr(file_db, "copy of xattrs may have failed");
@@ -1581,7 +1581,7 @@ pdb_check_xattrs(pseudo_msg_t *msg) {
        }
        int existing;
        sqlite3_bind_int(scan, 1, msg->dev);
-       sqlite3_bind_int(scan, 2, msg->ino);
+       sqlite3_bind_int64(scan, 2, msg->ino);
        rc = sqlite3_step(scan);
        if (rc == SQLITE_ROW) {
                existing = (int) sqlite3_column_int64(scan, 0);
@@ -2471,7 +2471,7 @@ pdb_get_xattr(pseudo_msg_t *msg, char **
        }
        pseudo_debug(PDBGF_XATTR, "requested xattr named '%s' for ino %lld\n", 
*value, (long long) msg->ino);
        sqlite3_bind_int(select, 1, msg->dev);
-       sqlite3_bind_int(select, 2, msg->ino);
+       sqlite3_bind_int64(select, 2, msg->ino);
        rc = sqlite3_bind_text(select, 3, *value, -1, SQLITE_STATIC);
        if (rc) {
                dberr(file_db, "couldn't bind xattr name to SELECT.");
@@ -2533,7 +2533,7 @@ pdb_list_xattr(pseudo_msg_t *msg, char *
                }
        }
        sqlite3_bind_int(select, 1, msg->dev);
-       sqlite3_bind_int(select, 2, msg->ino);
+       sqlite3_bind_int64(select, 2, msg->ino);
        do {
                rc = sqlite3_step(select);
                if (rc == SQLITE_ROW) {
@@ -2587,7 +2587,7 @@ pdb_remove_xattr(pseudo_msg_t *msg, char
                }
        }
        sqlite3_bind_int(delete, 1, msg->dev);
-       sqlite3_bind_int(delete, 2, msg->ino);
+       sqlite3_bind_int64(delete, 2, msg->ino);
        rc = sqlite3_bind_text(delete, 3, value, len, SQLITE_STATIC);
        if (rc) {
                dberr(file_db, "couldn't bind xattr name to DELETE.");
@@ -2628,7 +2628,7 @@ pdb_set_xattr(pseudo_msg_t *msg, char *v
                }
        }
        sqlite3_bind_int(select, 1, msg->dev);
-       sqlite3_bind_int(select, 2, msg->ino);
+       sqlite3_bind_int64(select, 2, msg->ino);
        rc = sqlite3_bind_text(select, 3, value, -1, SQLITE_STATIC);
        if (rc) {
                dberr(file_db, "couldn't bind xattr name to SELECT.");
-- 
_______________________________________________
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto

Reply via email to