strange problem with int64_t variables
Gabor Kovesdan
gabor at FreeBSD.org
Sun Jul 11 14:58:13 UTC 2010
Em 2010.07.11. 16:54, Dimitry Andric escreveu:
> On 2010-07-11 16:46, Gabor Kovesdan wrote:
>
>> I have two int64_t variables in kernel code, first is stored internally
>> and the second one is passed from a syscall argument. When I print them
>> with printf %lld modifier, the internal one behaves correctly but the
>> other one I pass from a syscall has a corrupted value. If I pass 1, it
>> prints out 3735348794091372545. I'm not doing anything special with it
>> just reading it out from the struct that was generated with make sysent.
>>
> Since 3735348794091372545 is 0x33d69ff000000001, it looks like the upper
> word got corrupted somehow. Maybe some part of it got non-atomically
> assigned? Maybe the wrong word was read? It is hard to tell without
> code... :)
>
Userland syscall calling:
killjob(getjid(), SIGINT); //getjid() returns 1 this case, whose type
is jid_t
Kernel code:
int
killjob(struct thread *td, struct killjob_args *uap)
{
struct jobentry *jp, *jtmp;
struct procentry *pp, *ptmp;
JOBLIST_WLOCK;
LIST_FOREACH_SAFE(jp,&irix_joblist, entries, jtmp) {
if (jp->jid == uap->jid) {
/* never reached code, comparison always fail because of corrupted value */
}
}
JOBLIST_WUNLOCK;
/* not such job */
td->td_retval[0] = -1;
return (ENOJOB);
}
Gabor
More information about the freebsd-hackers
mailing list