diff options
author | Andrew Tridgell <tridge@samba.org> | 2000-05-27 09:53:11 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2000-05-27 09:53:11 +0000 |
commit | 5f7c40f6d02df70dd3a92d5658f79b668e0ed5df (patch) | |
tree | 2532d4f40a220d77bd4118e56c599acd51cc5353 /source3/tdb/tdbutil.c | |
parent | 712a30ed51ca2b58e00d38a5d6d70d564b1da11b (diff) | |
download | samba-5f7c40f6d02df70dd3a92d5658f79b668e0ed5df.tar.gz samba-5f7c40f6d02df70dd3a92d5658f79b668e0ed5df.tar.xz 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.c | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/source3/tdb/tdbutil.c b/source3/tdb/tdbutil.c index 13934b54399..b253d5044a0 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; +} |