Revision: 13846
http://sourceforge.net/p/skim-app/code/13846
Author: hofman
Date: 2023-12-06 18:41:41 +0000 (Wed, 06 Dec 2023)
Log Message:
-----------
Make sure attribute names for fragments are not too long by restricting the
unique part
Modified Paths:
--------------
trunk/SkimNotes/SKNExtendedAttributeManager.m
Modified: trunk/SkimNotes/SKNExtendedAttributeManager.m
===================================================================
--- trunk/SkimNotes/SKNExtendedAttributeManager.m 2023-12-06 17:59:15 UTC
(rev 13845)
+++ trunk/SkimNotes/SKNExtendedAttributeManager.m 2023-12-06 18:41:41 UTC
(rev 13846)
@@ -42,6 +42,7 @@
#import <bzlib.h>
#define MAX_XATTR_LENGTH 2048
+#define MAX_XATTR_NAME_LENGTH 127
#define MIN_EXTRA_NAME_LENGTH 34
#define PREFIX @"net_sourceforge_skim-app"
@@ -362,6 +363,13 @@
// this will be a unique identifier for the set of keys we're about to
write (appending a counter to the UUID)
NSString *uniqueValue = [self uniqueName];
NSUInteger numberOfFragments = ([value length] / MAX_XATTR_LENGTH) +
([value length] % MAX_XATTR_LENGTH ? 1 : 0);
+ NSUInteger j = [attr rangeOfString:SYNCABLE_SEPARATOR].location;
+ NSString *suffix = j == NSNotFound || j == [attr length] - 1 ? @"" :
[attr substringFromIndex:j];
+ NSUInteger maxSuffixLength = [suffix length] + 2 +
(NSUInteger)floor(log10(MAX(2, numberOfFragments) - 1));
+
+ if ([uniqueValue length] + maxSuffixLength > MAX_XATTR_NAME_LENGTH)
+ uniqueValue = [uniqueValue substringToIndex:MAX_XATTR_NAME_LENGTH
- maxSuffixLength];
+
NSDictionary *wrapper = [NSDictionary
dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], _wrapperKey,
uniqueValue, _uniqueKey, [NSNumber
numberWithUnsignedInteger:numberOfFragments], _fragmentsKey, nil];
NSData *wrapperData = [NSPropertyListSerialization
dataWithPropertyList:wrapper format:NSPropertyListBinaryFormat_v1_0 options:0
error:NULL];
NSParameterAssert([wrapperData length] < MAX_XATTR_LENGTH &&
[wrapperData length] > 0);
@@ -377,9 +385,6 @@
NSUInteger i;
const char *valuePtr = [value bytes];
- NSUInteger j = [attr rangeOfString:SYNCABLE_SEPARATOR].location;
- NSString *suffix = j == NSNotFound || j == [attr length] - 1 ? @"" :
[attr substringFromIndex:j];
-
for (i = 0; success && i < numberOfFragments; i++) {
name = [[NSString alloc] initWithFormat:@"%@%@%lu%@", uniqueValue,
FRAGMENT_NAME_SEPARATOR, (long)i, suffix];
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit