Re: A problematic combination of malloc and getCharacters.
Re: A problematic combination of malloc and getCharacters.
- Subject: Re: A problematic combination of malloc and getCharacters.
- From: Aki Inoue <email@hidden>
- Date: Thu, 25 Oct 2007 15:56:53 -0700
I recommended -fileSystemRepresentation for the second argument of
AuthorizationExecuteWithPrivileges().
So,
AuthorizationExecuteWithPrivileges(authRef_, [shell UTF8String],
0, plistArgs, NULL);
should be
AuthorizationExecuteWithPrivileges(authRef_, [shell
fileSystemRepresentation], 0, plistArgs, NULL);
Also, you're allocating insufficient space for the arguments.
You're using the byte length for NSUnicodeStringEncoding where you're
supposed to use the length for NSUTF8StringEncoding with decomposition
in mind (which is usually much longer).
You should be able to do:
const char *plistArgs[3];
plistArgs[0] = [copyPlistScript_ UTF8String];
plistArgs[1] = [garage_ UTF8String];
plistArgs[2] = NULL;
Aki
On 2007/10/25, at 11:56, deepak gopal wrote:
Hi
I have made few changes and this is working and seems like there are
no memory problems with this code.
I am not using fileSystemRepresentation because then I will end up
casting constants, so using getFileSystemRepresentation instead.
// Allocating space for the args
char **plistArgs = (char **) malloc(3 *sizeof(char*));
NSString *shell = @"/bin/sh";
char *plistScript = (char *) malloc([copyPlistScript_
lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]);
// this gives space for Null.
[desktopCopyPlistScript_ getFileSystemRepresentation:plistScript
maxLength:
[copyPlistScript_
lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]];
char *garage = (char *) malloc([garage_
lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]);
[garage_ getFileSystemRepresentation:garage
maxLength:[garage_
lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]];
plistArgs[0] = plistScript;
plistArgs[1] = garage;
plistArgs[2] = NULL;
// Update the plists within all 3 Desktop components
OSStatus status =
AuthorizationExecuteWithPrivileges(authRef_, [shell UTF8String],
0, plistArgs, NULL);
if ((status == errAuthorizationCanceled) ||
(status != errAuthorizationSuccess)) {
NSLog(@"Desktop Break Change: Authorization failed when
installing new "
@"configuration plists.");
return NO;
}
// free the allocated memory
free(plistScript);
free(garage);
free(plistArgs);
----- Original Message ----
From: Aki Inoue <email@hidden>
To: deepak gopal <email@hidden>
Cc: cocoa dev <email@hidden>
Sent: Wednesday, 24 October, 2007 4:15:33 PM
Subject: Re: A problematic combination of malloc and getCharacters.
I believe AuthorizationExecuteWithPrivileges() is expecting NULL-
terminated, UTF-8, C-string as the args instead of non-terminated
unichar array.
You can use -UTF8String methods for that.
Since the second arg to the function is defined to be a POSIX path
representation, you should use -fileSystemRepresentation instead.
Aki
On 2007/10/24, at 15:58, deepak gopal wrote:
> Hi
>
> The method performChange would run a script which would modify a
> plist.
>
> When the control reaches line 12 I get this message "/: /: is a
> directory" in the run log and when I check in the debugger I find
> that plistScript and garage have "/" as the value. So I know where
> the problem is but dont' know what's causing it or what the solution
> is.
>
> There is no problem with the authorization or with the paths
> copyPlistScript_ (/tmp/script) or garage_ (/tmp/garage)
>
> I assume that the memory allocation in line 4 and line 6 would give
> the same result.
>
> Can someone guide me?
>
> 1 - (BOOL)performChange {
> 2 char **plistArgs = (char **) malloc(3 *sizeof(char*));
> 3 NSString *shell = @"/bin/sh";
>
> 4 char *plistScript = (char *) malloc([copyPlistScript_
> length]*sizeof(unichar));
> 5 [copyPlistScript_ getCharacters:(unichar *) plistScript];
>
> 6 char *garage = (char *) malloc([garage_
> lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]);
> 7 [garage_ getCharacters:(unichar *) garage];
>
> 8 plistArgs[0] = plistScript;
> 9 plistArgs[1] = garage;
> 10 plistArgs[2] = NULL;
>
> 12 OSStatus status = AuthorizationExecuteWithPrivileges(authRef_,
> [shell UTF8String], 0, plistArgs, NULL);
>
> 13 if ((status == errAuthorizationCanceled) || (status !=
> errAuthorizationSuccess)) {
> 14 NSLog(@"Desktop Break Change: Authorization failed when
> installing new configuration plists.");
> 15 return NO;
> 16 }
>
> 17 free(plistScript);
> 18 free(garage);
> 19 free(plistArgs);
> 20}
>
>
>
>
> Why delete messages? Unlimited storage is just a click away. Go
> to http://help.yahoo.com/l/in/yahoo/mail/yahoomail/tools/tools-08.html
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden
Chat on a cool, new interface. No download required. Click here.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden