summaryrefslogtreecommitdiff
path: root/source3/tdb/tdbutil.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2000-05-27 09:53:11 +0000
committerAndrew Tridgell <tridge@samba.org>2000-05-27 09:53:11 +0000
commit5f7c40f6d02df70dd3a92d5658f79b668e0ed5df (patch)
tree2532d4f40a220d77bd4118e56c599acd51cc5353 /source3/tdb/tdbutil.c
parent712a30ed51ca2b58e00d38a5d6d70d564b1da11b (diff)
downloadsamba-5f7c40f6d02df70dd3a92d5658f79b668e0ed5df.tar.gz
samba-5f7c40f6d02df70dd3a92d5658f79b668e0ed5df.tar.bz2
samba-5f7c40f6d02df70dd3a92d5658f79b668e0ed5df.zip
getting and setting security descriptors on printers now works
this needed some fixes in tdb_unpack(). Tim, you'll need to update (This used to be commit 9422719ab4c35e4ce3199b62dd632433bf391283)
Diffstat (limited to 'source3/tdb/tdbutil.c')
-rw-r--r--source3/tdb/tdbutil.c52
1 files changed, 42 insertions, 10 deletions
diff --git a/source3/tdb/tdbutil.c b/source3/tdb/tdbutil.c
index 13934b5439..b253d5044a 100644
--- a/source3/tdb/tdbutil.c
+++ b/source3/tdb/tdbutil.c
@@ -194,13 +194,13 @@ int tdb_unpack(char *buf, int bufsize, char *fmt, ...)
case 'd':
len = 4;
d = va_arg(ap, uint32 *);
- if (bufsize >= len) goto no_space;
+ if (bufsize < len) goto no_space;
*d = IVAL(buf, 0);
break;
case 'p':
len = 4;
p = va_arg(ap, void **);
- if (bufsize >= len) goto no_space;
+ if (bufsize < len) goto no_space;
*p = (void *)IVAL(buf, 0);
break;
case 'f':
@@ -213,14 +213,14 @@ int tdb_unpack(char *buf, int bufsize, char *fmt, ...)
i = va_arg(ap, int *);
b = va_arg(ap, char **);
len = 4;
- if (bufsize >= len) {
- *i = IVAL(buf, 0);
- len += *i;
- if (bufsize >= len) {
- *b = (char *)malloc(*i);
- memcpy(*b, buf+4, *i);
- }
- }
+ if (bufsize < len) goto no_space;
+ *i = IVAL(buf, 0);
+ if (! *i) break;
+ len += *i;
+ if (bufsize < len) goto no_space;
+ *b = (char *)malloc(*i);
+ if (! *b) goto no_space;
+ memcpy(*b, buf+4, *i);
break;
default:
DEBUG(0,("Unknown tdb_unpack format %c in %s\n",
@@ -240,3 +240,35 @@ int tdb_unpack(char *buf, int bufsize, char *fmt, ...)
}
+/* useful function to store a structure in rpc wire format */
+int tdb_prs_store(TDB_CONTEXT *tdb, char *keystr, prs_struct *ps)
+{
+ TDB_DATA kbuf, dbuf;
+ kbuf.dptr = keystr;
+ kbuf.dsize = strlen(keystr)+1;
+ dbuf.dptr = ps->data_p;
+ dbuf.dsize = ps->data_offset;
+
+ return tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
+}
+
+/* useful function to fetch a structure into rpc wire format */
+int tdb_prs_fetch(TDB_CONTEXT *tdb, char *keystr, prs_struct *ps)
+{
+ TDB_DATA kbuf, dbuf;
+ kbuf.dptr = keystr;
+ kbuf.dsize = strlen(keystr)+1;
+
+ dbuf = tdb_fetch(tdb, kbuf);
+ if (!dbuf.dptr) return -1;
+
+ ZERO_STRUCTP(ps);
+ ps->io = UNMARSHALL;
+ ps->align = 4;
+ ps->data_p = dbuf.dptr;
+ ps->data_offset = 0;
+ ps->buffer_size = dbuf.dsize;
+ ps->grow_size = dbuf.dsize;
+
+ return 0;
+}