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

Reply via email to