We see a crash in __strlen_sse2 but that seems "expected" to me as we are
passing `src` to it.
And at the level above src is a null pointer.
---
Lets go up the stack, here the call to push_ucs2_talloc:
(ctx=ctx@entry=0x0, dest=dest@entry=0x7ffe76d586a8, src=src@entry=0x0,
converted_size=converted_size@entry=0x7ffe76d586a0)
Note that:
- src = "where to copy from"
and
- ctx = "The talloc memory context"
are both null.
I don't know a lot about talloc, but ctx is intentionally null in this case
(seen in the call).
But copying from the empty string will surely not work.
---
This call in turn comes from E_md4hash higher up in the stack.
The empty string breaking us is the variable password which could be a hint.
---
E_md4hash gets the password from stack above - it passed it cleanly.
E_md4hash (passwd=0x0, p16=p16@entry=0x7ffe76d58a70 "")
---
So looking one up is `create_volume_objectid`
This tries to get the password with the following call:
lp_servicename(talloc_tos(), SNUM(conn))
We know it gets a NULL pointer and passes that on.
---
I see many places where the return of lp_servicename is not checked either (bad
practise)?
But on others e.g. source3/printing/notify.c line 424 it is:
422 »···const char *sharename = lp_servicename(talloc_tos(), snum);
423
424 »···if (sharename)
425 »···»···notify_printer_status_byname(ev, msg_ctx, sharename, status);
This function seems to be part of the samba3 protocol itself as I find it
defined:
source3/include/proto.h
But nowhere implemented.
Here we also find that calling this "password" might be a red herring.
It seems it just uses the same E_md4hash function, but nothing indicates that:
lp_servicename(talloc_tos(), SNUM(conn))
Would return a password.
---
Summary:
IMHO create_volume_objectid should not blindly pass things to E_md4hash.
It should check the pointer and return an error if things are wrong.
I checked the latest 4.7 branch but it is still the same.
I don't know enough about lp_servicename really make any decisions, I'd expect
something like:
unsigned char *create_volume_objectid(connection_struct *conn, unsigned char
objid[16])
{
- E_md4hash(lp_servicename(talloc_tos(), SNUM(conn)),objid);
- return objid;
+ char* pw = lp_servicename(talloc_tos();
+ if (pw) {
+ E_md4hash(lp_servicename(talloc_tos(), SNUM(conn)),objid);
+ return objid;
+ } else {
+ return NULL;
+ }
}
Unfortunately the functions calling create_volume_objectid also do not
check the return value either. And they used it there as "src" in a
memcpy so it would fail very similarly with a fault.
I think we would need to report that upstream (i.e. to people who
understand what "lp_servicename(talloc_tos(), SNUM(conn))" does in that
context.
@Andreas what do you think about all of the above?
@Thomas - with the data I found here do you think you could file an
upstream bug and report back the bug ID here for tracking the issue and
resolution?
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1817027
Title:
samba crashes when uploading files
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/samba/+bug/1817027/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs