Skip to content
Snippets Groups Projects
Commit 23b9c351 authored by George Nachman's avatar George Nachman
Browse files

Fix image decoder on older OSes: Remove uses of 10.11 base64 APIs and fix...

Fix image decoder on older OSes: Remove uses of 10.11 base64 APIs and fix sandbox permissions for 10.8.

Also uses the bitmap rep's dimensions instead of NSImage's dimensions, which are not always pixels (e.g., png can specify physical dimensions with the OS uses to scale the image down).
parent 1065b1eb
No related branches found
No related tags found
No related merge requests found
(version 1)
(deny default)
(allow file-read-data file-read-metadata
(regex "^/System/Library/ColorSync/Profiles")
(regex "^/System/Library/Frameworks")
(regex "^/System/Library/PrivateFrameworks")
(literal "/dev/null")
(literal "@PATH_TO_EXECUTABLE@")
(literal "@PATH_TO_EXECUTABLE@/@EXECUTABLE@")
(regex "^/usr/lib"))
 
(allow process-exec (literal "@PATH_TO_EXECUTABLE@/@EXECUTABLE@"))
Loading
Loading
Loading
Loading
@@ -1325,6 +1325,7 @@
A647E3A918C353C500450FA1 /* VT100StringParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A647E3A718C353C500450FA1 /* VT100StringParser.h */; };
A647E3AE18C3588800450FA1 /* VT100ControlParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A647E3AC18C3588800450FA1 /* VT100ControlParser.h */; };
A647E3B718C5884600450FA1 /* iTermObjectPool.h in Headers */ = {isa = PBXBuildFile; fileRef = A647E3B518C5884600450FA1 /* iTermObjectPool.h */; };
A656AE4C1DBBE1CE00CE8448 /* libaprutil-1.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A656AE4B1DBBE1CE00CE8448 /* libaprutil-1.tbd */; };
A658716A1D85E6700061CEEE /* PFMoveApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = A65871681D85E6700061CEEE /* PFMoveApplication.h */; };
A658716B1D85E6750061CEEE /* PFMoveApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = A65871671D85E6700061CEEE /* PFMoveApplication.m */; };
A65B72521B1A5D7500F947A7 /* WarningSign.png in Resources */ = {isa = PBXBuildFile; fileRef = A65B72501B1A5D7500F947A7 /* WarningSign.png */; };
Loading
Loading
@@ -3009,6 +3010,7 @@
A647E3B518C5884600450FA1 /* iTermObjectPool.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = iTermObjectPool.h; sourceTree = "<group>"; tabWidth = 4; };
A647E3B618C5884600450FA1 /* iTermObjectPool.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = iTermObjectPool.m; sourceTree = "<group>"; tabWidth = 4; };
A64AB26219B97B670033DB9C /* iTerm2ForApplescriptTesting-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "iTerm2ForApplescriptTesting-Info.plist"; sourceTree = "<group>"; };
A656AE4B1DBBE1CE00CE8448 /* libaprutil-1.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libaprutil-1.tbd"; path = "usr/lib/libaprutil-1.tbd"; sourceTree = SDKROOT; };
A65871671D85E6700061CEEE /* PFMoveApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PFMoveApplication.m; path = LetsMove/PFMoveApplication.m; sourceTree = "<group>"; };
A65871681D85E6700061CEEE /* PFMoveApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PFMoveApplication.h; path = LetsMove/PFMoveApplication.h; sourceTree = "<group>"; };
A65B72501B1A5D7500F947A7 /* WarningSign.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = WarningSign.png; path = images/WarningSign.png; sourceTree = "<group>"; };
Loading
Loading
@@ -3616,6 +3618,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
A656AE4C1DBBE1CE00CE8448 /* libaprutil-1.tbd in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Loading
Loading
@@ -4562,6 +4565,7 @@
1DD39AD5180B8118004E56D5 /* Frameworks */ = {
isa = PBXGroup;
children = (
A656AE4B1DBBE1CE00CE8448 /* libaprutil-1.tbd */,
A6184F881BAB3ED70088EF3C /* ColorPicker.framework */,
1D94EAC712D641D3008225A9 /* AddressBook.framework */,
1DEB293D1288899A00B2CB9F /* Carbon.framework */,
Loading
Loading
Loading
Loading
@@ -10,6 +10,28 @@
//
 
#import "iTermSerializableImage.h"
#import <apr-1/apr_base64.h>
@interface NSData(ImageDecoder)
@end
@implementation NSData(ImageDecoder)
// Get rid of this and use base64EncodedDataWithOptions when 10.8 support is dropped.
- (NSString *)imageDecoder_base64String {
// Subtract because the result includes the trailing null. Take MAX in case it returns 0 for
// some reason.
int length = MAX(0, apr_base64_encode_len((int)self.length) - 1);
NSMutableData *buffer = [NSMutableData dataWithLength:length];
if (buffer) {
apr_base64_encode_binary(buffer.mutableBytes,
self.bytes,
(int)self.length);
}
return [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding];
}
@end
 
@implementation iTermSerializableImage
 
Loading
Loading
@@ -57,7 +79,7 @@
NSMutableArray<NSString *> *result = [NSMutableArray array];
for (NSImage *image in self.images) {
NSData *data = [self dataForImage:image];
NSString *encoded = [[NSString alloc] initWithData:[data base64EncodedDataWithOptions:0] encoding:NSUTF8StringEncoding];
NSString *encoded = [data imageDecoder_base64String];
if (encoded) {
[result addObject:encoded];
}
Loading
Loading
Loading
Loading
@@ -63,7 +63,9 @@ int main(int argc, const char * argv[]) {
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)data,
(CFDictionaryRef)@{});
size_t count = CGImageSourceGetCount(source);
serializableImage.size = image.size;
NSImageRep *rep = [[image representations] firstObject];
NSSize imageSize = NSMakeSize(rep.pixelsWide, rep.pixelsHigh);
serializableImage.size = imageSize;
if (count > 1) {
syslog(LOG_DEBUG, "multiple frames found");
Loading
Loading
Loading
Loading
@@ -9,6 +9,7 @@
#import "iTermImage.h"
#import "DebugLogging.h"
#import "iTermImageDecoderDriver.h"
#import "NSData+iTerm.h"
#import "NSImage+iTerm.h"
 
static const CGFloat kMaxDimension = 10000;
Loading
Loading
@@ -107,7 +108,7 @@ static const CGFloat kMaxDimension = 10000;
DLog(@"Bogus image string of class %@", [imageString class]);
}
 
NSData *data = [[[NSData alloc] initWithBase64EncodedString:imageString options:0] autorelease];
NSData *data = [NSData dataWithBase64EncodedString:imageString];
if (!data || data.length > kMaxDimension * kMaxDimension * 4) {
DLog(@"Could not decode base64 encoded image string");
return nil;
Loading
Loading
Loading
Loading
@@ -209,6 +209,7 @@ static void ExecImageDecoder(char *executable, char *sandbox, int jsonFD, int co
char *sandbox = strdup([sandboxString UTF8String]);
int dtablesize = getdtablesize();
 
DLog(@"sandbox-exec -p '%@' '%@'", sandboxString, executable);
pid_t pid = fork();
switch (pid) {
case -1:
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment