PERFORCE change 167933 for review

Jonathan Anderson jona at FreeBSD.org
Fri Aug 28 22:19:26 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=167933

Change 167933 by jona at jona-trustedbsd-belle-vmware on 2009/08/28 22:18:41

	Better passing of rights, including 64b type handling

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.c#14 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.h#13 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.c#14 (text+ko) ====

@@ -232,10 +232,9 @@
 	data[0] = ua_marshall_int(UA_OPEN_PATH);
 	data[1] = ua_marshall_string(path, strlen(path));
 	data[2] = ua_marshall_int(flags);
-	data[3] = ua_marshall_int(rights);
+	data[3] = ua_marshall_long(rights);
 	data[4] = ua_marshall_int(mask);
 
-
 	for(int i = 0; i <= 4; i++)
 	{
 		if(ua_send(angel, data[i], NULL, 0) < 0) return -1;
@@ -277,40 +276,40 @@
 	if(angel < 0) return NULL;
 
 	int flags = 0;
-	cap_rights_t rights = CAP_SEEK | CAP_FSYNC;
+	cap_rights_t rights = CAP_SEEK | CAP_FSYNC | CAP_FCNTL | CAP_FCHFLAGS | CAP_MASK_VALID;
 
-	if(strstr(mode, "r+"))
+	if(strnstr(mode, "r+", 3))
 	{
 		flags	|= O_RDWR;
 		rights	|= CAP_READ | CAP_WRITE | CAP_FTRUNCATE;
 	}
-	else if(strstr(mode, "r"))
+	else if(strnstr(mode, "r", 2))
 	{
 		flags	|= O_RDONLY;
 		rights	|= CAP_READ;
 	}
-	else if(strstr(mode, "w+"))
+	else if(strnstr(mode, "w+", 3))
 	{
 		flags	|= O_RDWR | O_CREAT | O_TRUNC;
 		rights	|= CAP_READ | CAP_WRITE | CAP_FTRUNCATE;
 	}
-	else if(strstr(mode, "w"))
+	else if(strnstr(mode, "w", 2))
 	{
 		flags	|= O_WRONLY | O_CREAT | O_TRUNC;
 		rights	|= CAP_WRITE | CAP_FTRUNCATE;
 	}
-	else if(strstr(mode, "a+"))
+	else if(strnstr(mode, "a+", 3))
 	{
 		flags	|= O_RDWR | O_CREAT | O_APPEND;
 		rights	|= CAP_READ | CAP_WRITE | CAP_FTRUNCATE;
 	}
-	else if(strstr(mode, "a"))
+	else if(strnstr(mode, "a", 2))
 	{
 		flags	|= O_WRONLY | O_CREAT | O_APPEND;
 		rights	|= CAP_WRITE | CAP_FTRUNCATE;
 	}
 
-	int fd = ua_open(path, flags);
+	int fd = ua_ropen(path, flags, rights, 0);
 	if(flags & O_APPEND)
 		if(lseek(fd, 0, SEEK_END) < 0)
 		{
@@ -320,6 +319,10 @@
 			return NULL;
 		}
 
+	char buf[80];
+	bzero(buf, 80);
+	if(read(fd, buf, 35) < 0) perror("Error reading file");
+
 	return fdopen(fd, mode);
 }
 
@@ -542,6 +545,52 @@
 
 
 
+datum* ua_marshall_long(int64_t value)
+{
+	int size = sizeof(datum) + sizeof(value);
+	datum *d = (datum*) malloc(size);
+	
+	d->type = LONG | INTEGER;
+	d->length = sizeof(value);
+
+	void *address = ((char*) d) + sizeof(datum);
+	((int64_t*) address)[0] = value;
+
+	return d;
+}
+
+
+
+int ua_unmarshall_long(const datum *d, int64_t *value)
+{
+	if(d == NULL)
+	{
+		errno = EINVAL;
+		return -1;
+	}
+
+	if(!(d->type & (LONG | INTEGER)))
+	{
+		if(d->type & ERROR) handle_error(d);
+		else errno = EINVAL;
+		return -1;
+	}
+
+	if(d->length > sizeof(int64_t))
+	{
+		errno = EOVERFLOW;
+		return -1;
+	}
+	else bzero(value, sizeof(int32_t));
+
+	memcpy(value, ((const char*) d) + sizeof(datum), sizeof(*value));
+
+	return d->length;
+}
+
+
+
+
 datum* ua_marshall_string(const char *value, unsigned int len)
 {
 	int size = sizeof(datum) + len;
@@ -655,7 +704,7 @@
 	data[4] = ua_marshall_int(options->mult);
 	data[5] = ua_marshall_string(options->filter, options->filterlen);
 	data[6] = ua_marshall_int(options->flags);
-	data[7] = ua_marshall_int(options->rights);
+	data[7] = ua_marshall_long(options->rights);
 	data[8] = ua_marshall_int(options->umask);
 
 	int total_size = 0;
@@ -743,8 +792,9 @@
 	options->flags = tmp_int;
 	head = (const datum*) (((const char*) head) + sizeof(datum) + head->length);
 
-	if(ua_unmarshall_int(head, &tmp_int) < 0) return -1;
-	options->rights = tmp_int;
+	int64_t tmp_long;
+	if(ua_unmarshall_long(head, &tmp_long) < 0) return -1;
+	options->rights = tmp_long;
 	head = (const datum*) (((const char*) head) + sizeof(datum) + head->length);
 
 	if(ua_unmarshall_int(head, &tmp_int) < 0) return -1;
@@ -757,13 +807,14 @@
 
 void handle_error(const datum *d)
 {
-	int32_t errnum;
+	int32_t errnum = 0;
 	char msg[200];
 	int msglen = 200;
 
-	if(ua_unmarshall_error(d, &errnum, msg, &msglen) < 0) return;
+	ua_unmarshall_error(d, &errnum, msg, &msglen);
 
 	errno = errnum;
+	printf("libuserangel error: %s\n", msg);
 
 	/* TODO: do something!
 	fprintf(stderr, "user_angel error: %s (%i: %s)\n",

==== //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.h#13 (text+ko) ====

@@ -122,6 +122,7 @@
 
 /* Unmarshalling functions; calling programs should free the result */
 struct ua_datum* ua_marshall_int(int32_t value);
+struct ua_datum* ua_marshall_long(int64_t value);
 struct ua_datum* ua_marshall_string(const char *value, unsigned int len);
 struct ua_datum* ua_marshall_error(int errnum, const char *msg, unsigned int msglen);
 struct ua_datum* ua_marshall_powerbox(const struct ua_powerbox_options *options);
@@ -129,6 +130,7 @@
 
 /* Unmarshalling functions; return the number of bytes unmarshalled (or -1) */
 int ua_unmarshall_int(const struct ua_datum *d, int32_t *value);
+int ua_unmarshall_long(const struct ua_datum *d, int64_t *value);
 int ua_unmarshall_bytes(const struct ua_datum *d, char *value, unsigned int *len);
 int ua_unmarshall_string(const struct ua_datum *d, char *value, unsigned int *len);
 int ua_unmarshall_error(const struct ua_datum *d, int *errnum, char *msg, int *msglen);


More information about the p4-projects mailing list