Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/fs/hfs Fix support for case sensitive HFS.



details:   https://anonhg.NetBSD.org/src/rev/eb393a240ca5
branches:  trunk
changeset: 838028:eb393a240ca5
user:      sevan <sevan%NetBSD.org@localhost>
date:      Sun Dec 30 22:40:00 2018 +0000

description:
Fix support for case sensitive HFS.
Without this change, the wrong file is returned, if 2 file names contain a
subset of each other.


Code submitted in PR bin/52993 by Harold Gutch

diffstat:

 sys/fs/hfs/libhfs.c |  63 +++++++++++++++++++++++++++-------------------------
 1 files changed, 33 insertions(+), 30 deletions(-)

diffs (115 lines):

diff -r 4b7077f6f36e -r eb393a240ca5 sys/fs/hfs/libhfs.c
--- a/sys/fs/hfs/libhfs.c       Sun Dec 30 21:58:11 2018 +0000
+++ b/sys/fs/hfs/libhfs.c       Sun Dec 30 22:40:00 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: libhfs.c,v 1.14 2015/06/21 13:40:25 maxv Exp $ */
+/*     $NetBSD: libhfs.c,v 1.15 2018/12/30 22:40:00 sevan Exp $        */
 
 /*-
  * Copyright (c) 2005, 2007 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: libhfs.c,v 1.14 2015/06/21 13:40:25 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: libhfs.c,v 1.15 2018/12/30 22:40:00 sevan Exp $");
 
 #include "libhfs.h"
 
@@ -2384,37 +2384,42 @@
 /* binary compare (i.e., not case folding) */
 int
 hfslib_compare_catalog_keys_bc (
-       const void *a,
-       const void *b)
+       const void *ap,
+       const void *bp)
 {
-       if (((const hfs_catalog_key_t*)a)->parent_cnid
-               == ((const hfs_catalog_key_t*)b)->parent_cnid)
+       int c;
+       const hfs_catalog_key_t *a, *b;
+
+       a = (const hfs_catalog_key_t *) ap;
+       b = (const hfs_catalog_key_t *) bp;
+
+       if (a->parent_cnid == b->parent_cnid)
        {
-               if (((const hfs_catalog_key_t*)a)->name.length == 0 &&
-                       ((const hfs_catalog_key_t*)b)->name.length == 0)
+               if (a->name.length == 0 && b->name.length == 0)
                        return 0;
 
-               if (((const hfs_catalog_key_t*)a)->name.length == 0)
+               if (a->name.length == 0)
                        return -1;
-               if (((const hfs_catalog_key_t*)b)->name.length == 0)
+               if (b->name.length == 0)
                        return 1;
 
                /* FIXME: This does a byte-per-byte comparison, whereas the HFS spec
                 * mandates a uint16_t chunk comparison. */
-               return memcmp(((const hfs_catalog_key_t*)a)->name.unicode,
-                       ((const hfs_catalog_key_t*)b)->name.unicode,
-                       min(((const hfs_catalog_key_t*)a)->name.length,
-                               ((const hfs_catalog_key_t*)b)->name.length));
+               c = memcmp(a->name.unicode, b->name.unicode,
+                       sizeof(unichar_t)*min(a->name.length, b->name.length));
+               if (c != 0)
+                       return c;
+               else
+                       return (a->name.length - b->name.length);
        } else {
-               return (((const hfs_catalog_key_t*)a)->parent_cnid - 
-                               ((const hfs_catalog_key_t*)b)->parent_cnid);
+               return (a->parent_cnid - b->parent_cnid);
        }
 }
 
 int
 hfslib_compare_extent_keys (
-       const void *a,
-       const void *b)
+       const void *ap,
+       const void *bp)
 {
        /*
         *      Comparison order, in descending importance:
@@ -2422,27 +2427,25 @@
         *              CNID -> fork type -> start block
         */
 
-       if (((const hfs_extent_key_t*)a)->file_cnid
-               == ((const hfs_extent_key_t*)b)->file_cnid)
+       const hfs_extent_key_t *a, *b;
+       a = (const hfs_extent_key_t *) ap;
+       b = (const hfs_extent_key_t *) bp;
+
+       if (a->file_cnid == b->file_cnid)
        {
-               if (((const hfs_extent_key_t*)a)->fork_type
-                       == ((const hfs_extent_key_t*)b)->fork_type)
+               if (a->fork_type == b->fork_type)
                {
-                       if (((const hfs_extent_key_t*)a)->start_block
-                               == ((const hfs_extent_key_t*)b)->start_block)
+                       if (a->start_block == b->start_block)
                        {
                                return 0;
                        } else {
-                               return (((const hfs_extent_key_t*)a)->start_block - 
-                                               ((const hfs_extent_key_t*)b)->start_block);
+                               return (a->start_block - b->start_block);
                        }
                } else {
-                       return (((const hfs_extent_key_t*)a)->fork_type - 
-                                       ((const hfs_extent_key_t*)b)->fork_type);
+                       return (a->fork_type - b->fork_type);
                }
        } else {
-               return (((const hfs_extent_key_t*)a)->file_cnid - 
-                               ((const hfs_extent_key_t*)b)->file_cnid);
+               return (a->file_cnid - b->file_cnid);
        }
 }
 



Home | Main Index | Thread Index | Old Index