Introduction
Introduction Statistics Contact Development Disclaimer Help
Fixed failed assertion when parsing multiple credentials entries. Worked around…
git clone git://git.codemadness.org/susmb
Log
Files
Refs
README
LICENSE
---
commit bd6bdba3c118872e3062daf7fd260d330745af8f
parent db77d112648c00a8456b39c1a5faa0ac061d14f7
Author: geoff <devnull@localhost>
Date: Thu, 18 May 2006 20:13:31 +0000
Fixed failed assertion when parsing multiple credentials entries.
Worked around bug? in Windows server behaviour exhibited by md5sum: a
read of 32768 bytes works, then a read of 65536 bytes returns 0 bytes.
Samba doesn't do this. Implemented the same fix for usmb_write, although
I have not checked whether corresponding behaviour exists.
Diffstat:
M sax.c | 4 ++++
M usmb_file.c | 52 ++++++++++++++++++++++++++++-…
2 files changed, 51 insertions(+), 5 deletions(-)
---
diff --git a/sax.c b/sax.c
@@ -566,6 +566,10 @@ static void end_creds (struct sax_parser *sp)
g_string_free (sp->strs.credentials.username, TRUE);
g_string_free (sp->strs.credentials.password, TRUE);
+ sp->strs.credentials.domain = NULL;
+ sp->strs.credentials.username = NULL;
+ sp->strs.credentials.password = NULL;
+
if (ERROR == sp->state)
xfree (sp->strs.credentials.id);
}
diff --git a/usmb_file.c b/usmb_file.c
@@ -94,13 +94,35 @@ int usmb_read (const char *filename, char *buff, size_t len…
(void)filename;
(void)off;
- DEBUG (fprintf (stderr, "read (%p, %u)\n", buff, len));
+ DEBUG (fprintf (stderr, "read (%p, %u, %lld) ", buff, len, off));
if (smbc_lseek (fi->fh, off, SEEK_SET) < 0)
+ {
+ fprintf (stderr, "- seek failed: %d\n", -errno);
return -errno;
+ }
- int bytes = smbc_read (fi->fh, buff, len);
- return (bytes < 0) ? -errno : bytes;
+ size_t got = 0;
+ int bytes = 0;
+
+ // seems that reads of > 32768 bytes don't work with real Windows servers
+ while (got < len)
+ {
+ bytes = smbc_read (fi->fh, buff, (len > 32768) ? 32768 : len);
+
+ if (bytes < 0)
+ break;
+
+ got += bytes;
+ buff += bytes;
+
+ // avoids infinite loops
+ if (0 == bytes)
+ break;
+ }
+
+ DEBUG (fprintf (stderr, " = %d\n", (bytes < 0) ? -errno : (int)got));
+ return (bytes < 0) ? -errno : (int)got;
}
@@ -115,8 +137,28 @@ int usmb_write (const char *filename, const char *buff, si…
if (smbc_lseek (fi->fh, off, SEEK_SET) < 0)
return -errno;
- int bytes = smbc_write (fi->fh, (char *)buff, len);
- return (bytes < 0) ? -errno : bytes;
+ size_t written = 0;
+ int bytes = 0;
+
+ // No idea whether Windows servers don't like > 32768 byte writes
+ // (cf. usmb_read), but taking no chances...
+ while (written < len)
+ {
+ bytes = smbc_write (fi->fh, (char *)buff, (len > 32768) ? 32768 : len);
+
+ if (bytes < 0)
+ break;
+
+ written += bytes;
+ buff += bytes;
+
+ // avoids infinite loops
+ if (0 == bytes)
+ break;
+ }
+
+ DEBUG (fprintf (stderr, " = %d\n", (bytes < 0) ? -errno : (int)written…
+ return (bytes < 0) ? -errno : (int)written;
}
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.