cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

collate.c (2901B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * collate.c - NTFS kernel collation handling.  Part of the Linux-NTFS project.
      4 *
      5 * Copyright (c) 2004 Anton Altaparmakov
      6 */
      7
      8#include "collate.h"
      9#include "debug.h"
     10#include "ntfs.h"
     11
     12static int ntfs_collate_binary(ntfs_volume *vol,
     13		const void *data1, const int data1_len,
     14		const void *data2, const int data2_len)
     15{
     16	int rc;
     17
     18	ntfs_debug("Entering.");
     19	rc = memcmp(data1, data2, min(data1_len, data2_len));
     20	if (!rc && (data1_len != data2_len)) {
     21		if (data1_len < data2_len)
     22			rc = -1;
     23		else
     24			rc = 1;
     25	}
     26	ntfs_debug("Done, returning %i", rc);
     27	return rc;
     28}
     29
     30static int ntfs_collate_ntofs_ulong(ntfs_volume *vol,
     31		const void *data1, const int data1_len,
     32		const void *data2, const int data2_len)
     33{
     34	int rc;
     35	u32 d1, d2;
     36
     37	ntfs_debug("Entering.");
     38	// FIXME:  We don't really want to bug here.
     39	BUG_ON(data1_len != data2_len);
     40	BUG_ON(data1_len != 4);
     41	d1 = le32_to_cpup(data1);
     42	d2 = le32_to_cpup(data2);
     43	if (d1 < d2)
     44		rc = -1;
     45	else {
     46		if (d1 == d2)
     47			rc = 0;
     48		else
     49			rc = 1;
     50	}
     51	ntfs_debug("Done, returning %i", rc);
     52	return rc;
     53}
     54
     55typedef int (*ntfs_collate_func_t)(ntfs_volume *, const void *, const int,
     56		const void *, const int);
     57
     58static ntfs_collate_func_t ntfs_do_collate0x0[3] = {
     59	ntfs_collate_binary,
     60	NULL/*ntfs_collate_file_name*/,
     61	NULL/*ntfs_collate_unicode_string*/,
     62};
     63
     64static ntfs_collate_func_t ntfs_do_collate0x1[4] = {
     65	ntfs_collate_ntofs_ulong,
     66	NULL/*ntfs_collate_ntofs_sid*/,
     67	NULL/*ntfs_collate_ntofs_security_hash*/,
     68	NULL/*ntfs_collate_ntofs_ulongs*/,
     69};
     70
     71/**
     72 * ntfs_collate - collate two data items using a specified collation rule
     73 * @vol:	ntfs volume to which the data items belong
     74 * @cr:		collation rule to use when comparing the items
     75 * @data1:	first data item to collate
     76 * @data1_len:	length in bytes of @data1
     77 * @data2:	second data item to collate
     78 * @data2_len:	length in bytes of @data2
     79 *
     80 * Collate the two data items @data1 and @data2 using the collation rule @cr
     81 * and return -1, 0, ir 1 if @data1 is found, respectively, to collate before,
     82 * to match, or to collate after @data2.
     83 *
     84 * For speed we use the collation rule @cr as an index into two tables of
     85 * function pointers to call the appropriate collation function.
     86 */
     87int ntfs_collate(ntfs_volume *vol, COLLATION_RULE cr,
     88		const void *data1, const int data1_len,
     89		const void *data2, const int data2_len) {
     90	int i;
     91
     92	ntfs_debug("Entering.");
     93	/*
     94	 * FIXME:  At the moment we only support COLLATION_BINARY and
     95	 * COLLATION_NTOFS_ULONG, so we BUG() for everything else for now.
     96	 */
     97	BUG_ON(cr != COLLATION_BINARY && cr != COLLATION_NTOFS_ULONG);
     98	i = le32_to_cpu(cr);
     99	BUG_ON(i < 0);
    100	if (i <= 0x02)
    101		return ntfs_do_collate0x0[i](vol, data1, data1_len,
    102				data2, data2_len);
    103	BUG_ON(i < 0x10);
    104	i -= 0x10;
    105	if (likely(i <= 3))
    106		return ntfs_do_collate0x1[i](vol, data1, data1_len,
    107				data2, data2_len);
    108	BUG();
    109	return 0;
    110}