Deleted Added
full compact
sysv_msg.c (100523) sysv_msg.c (101772)
1/* $FreeBSD: head/sys/kern/sysv_msg.c 100523 2002-07-22 18:27:54Z alfred $ */
1/* $FreeBSD: head/sys/kern/sysv_msg.c 101772 2002-08-13 08:00:36Z alfred $ */
2
3/*
4 * Implementation of SVID messages
5 *
6 * Author: Daniel Boulet
7 *
8 * Copyright 1993 Daniel Boulet and RTMX Inc.
9 *

--- 114 unchanged lines hidden (view full) ---

124
125static int nfree_msgmaps; /* # of free map entries */
126static short free_msgmaps; /* head of linked list of free map entries */
127static struct msg *free_msghdrs;/* list of free msg headers */
128static char *msgpool; /* MSGMAX byte long msg buffer pool */
129static struct msgmap *msgmaps; /* MSGSEG msgmap structures */
130static struct msg *msghdrs; /* MSGTQL msg headers */
131static struct msqid_ds *msqids; /* MSGMNI msqid_ds struct's */
2
3/*
4 * Implementation of SVID messages
5 *
6 * Author: Daniel Boulet
7 *
8 * Copyright 1993 Daniel Boulet and RTMX Inc.
9 *

--- 114 unchanged lines hidden (view full) ---

124
125static int nfree_msgmaps; /* # of free map entries */
126static short free_msgmaps; /* head of linked list of free map entries */
127static struct msg *free_msghdrs;/* list of free msg headers */
128static char *msgpool; /* MSGMAX byte long msg buffer pool */
129static struct msgmap *msgmaps; /* MSGSEG msgmap structures */
130static struct msg *msghdrs; /* MSGTQL msg headers */
131static struct msqid_ds *msqids; /* MSGMNI msqid_ds struct's */
132static struct mtx msq_mtx; /* global mutex for message queues. */
132
133static void
134msginit()
135{
136 register int i;
137
138 TUNABLE_INT_FETCH("kern.ipc.msgseg", &msginfo.msgseg);
139 TUNABLE_INT_FETCH("kern.ipc.msgssz", &msginfo.msgssz);

--- 58 unchanged lines hidden (view full) ---

198 if (msqids == NULL)
199 panic("msqids is NULL");
200
201 for (i = 0; i < msginfo.msgmni; i++) {
202 msqids[i].msg_qbytes = 0; /* implies entry is available */
203 msqids[i].msg_perm.seq = 0; /* reset to a known value */
204 msqids[i].msg_perm.mode = 0;
205 }
133
134static void
135msginit()
136{
137 register int i;
138
139 TUNABLE_INT_FETCH("kern.ipc.msgseg", &msginfo.msgseg);
140 TUNABLE_INT_FETCH("kern.ipc.msgssz", &msginfo.msgssz);

--- 58 unchanged lines hidden (view full) ---

199 if (msqids == NULL)
200 panic("msqids is NULL");
201
202 for (i = 0; i < msginfo.msgmni; i++) {
203 msqids[i].msg_qbytes = 0; /* implies entry is available */
204 msqids[i].msg_perm.seq = 0; /* reset to a known value */
205 msqids[i].msg_perm.mode = 0;
206 }
207 mtx_init(&msq_mtx, "msq", NULL, MTX_DEF);
206}
207
208static int
209msgunload()
210{
211 struct msqid_ds *msqptr;
212 int msqid;
213

--- 11 unchanged lines hidden (view full) ---

225 }
226 if (msqid != msginfo.msgmni)
227 return (EBUSY);
228
229 free(msgpool, M_MSG);
230 free(msgmaps, M_MSG);
231 free(msghdrs, M_MSG);
232 free(msqids, M_MSG);
208}
209
210static int
211msgunload()
212{
213 struct msqid_ds *msqptr;
214 int msqid;
215

--- 11 unchanged lines hidden (view full) ---

227 }
228 if (msqid != msginfo.msgmni)
229 return (EBUSY);
230
231 free(msgpool, M_MSG);
232 free(msgmaps, M_MSG);
233 free(msghdrs, M_MSG);
234 free(msqids, M_MSG);
235 mtx_destroy(&msq_mtx);
233 return (0);
234}
235
236
237static int
238sysvmsg_modload(struct module *module, int cmd, void *arg)
239{
240 int error = 0;

--- 49 unchanged lines hidden (view full) ---

290 } */ *uap;
291{
292 int error;
293
294 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
295 return (ENOSYS);
296 if (uap->which >= sizeof(msgcalls)/sizeof(msgcalls[0]))
297 return (EINVAL);
236 return (0);
237}
238
239
240static int
241sysvmsg_modload(struct module *module, int cmd, void *arg)
242{
243 int error = 0;

--- 49 unchanged lines hidden (view full) ---

293 } */ *uap;
294{
295 int error;
296
297 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
298 return (ENOSYS);
299 if (uap->which >= sizeof(msgcalls)/sizeof(msgcalls[0]))
300 return (EINVAL);
298 mtx_lock(&Giant);
299 error = (*msgcalls[uap->which])(td, &uap->a2);
301 error = (*msgcalls[uap->which])(td, &uap->a2);
300 mtx_unlock(&Giant);
301 return (error);
302}
303
304static void
305msg_freehdr(msghdr)
306 struct msg *msghdr;
307{
308 while (msghdr->msg_ts > 0) {

--- 38 unchanged lines hidden (view full) ---

347 int rval, error;
348 struct msqid_ds msqbuf;
349 register struct msqid_ds *msqptr;
350
351 DPRINTF(("call to msgctl(%d, %d, 0x%x)\n", msqid, cmd, user_msqptr));
352 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
353 return (ENOSYS);
354
302 return (error);
303}
304
305static void
306msg_freehdr(msghdr)
307 struct msg *msghdr;
308{
309 while (msghdr->msg_ts > 0) {

--- 38 unchanged lines hidden (view full) ---

348 int rval, error;
349 struct msqid_ds msqbuf;
350 register struct msqid_ds *msqptr;
351
352 DPRINTF(("call to msgctl(%d, %d, 0x%x)\n", msqid, cmd, user_msqptr));
353 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
354 return (ENOSYS);
355
355 mtx_lock(&Giant);
356 msqid = IPCID_TO_IX(msqid);
357
358 if (msqid < 0 || msqid >= msginfo.msgmni) {
359 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid,
360 msginfo.msgmni));
356 msqid = IPCID_TO_IX(msqid);
357
358 if (msqid < 0 || msqid >= msginfo.msgmni) {
359 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid,
360 msginfo.msgmni));
361 error = EINVAL;
362 goto done2;
361 return (EINVAL);
363 }
362 }
363 if (cmd == IPC_SET &&
364 (error = copyin(user_msqptr, &msqbuf, sizeof(msqbuf))) != 0)
365 return (error);
364
365 msqptr = &msqids[msqid];
366
366
367 msqptr = &msqids[msqid];
368
369 mtx_lock(&msq_mtx);
367 if (msqptr->msg_qbytes == 0) {
368 DPRINTF(("no such msqid\n"));
369 error = EINVAL;
370 goto done2;
371 }
372 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) {
373 DPRINTF(("wrong sequence number\n"));
374 error = EINVAL;

--- 33 unchanged lines hidden (view full) ---

408 wakeup(msqptr);
409 }
410
411 break;
412
413 case IPC_SET:
414 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_M)))
415 goto done2;
370 if (msqptr->msg_qbytes == 0) {
371 DPRINTF(("no such msqid\n"));
372 error = EINVAL;
373 goto done2;
374 }
375 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) {
376 DPRINTF(("wrong sequence number\n"));
377 error = EINVAL;

--- 33 unchanged lines hidden (view full) ---

411 wakeup(msqptr);
412 }
413
414 break;
415
416 case IPC_SET:
417 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_M)))
418 goto done2;
416 if ((error = copyin(user_msqptr, &msqbuf, sizeof(msqbuf))) != 0)
417 goto done2;
418 if (msqbuf.msg_qbytes > msqptr->msg_qbytes) {
419 error = suser(td);
420 if (error)
421 goto done2;
422 }
423 if (msqbuf.msg_qbytes > msginfo.msgmnb) {
424 DPRINTF(("can't increase msg_qbytes beyond %d"
425 "(truncating)\n", msginfo.msgmnb));

--- 12 unchanged lines hidden (view full) ---

438 msqptr->msg_ctime = time_second;
439 break;
440
441 case IPC_STAT:
442 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_R))) {
443 DPRINTF(("requester doesn't have read access\n"));
444 goto done2;
445 }
419 if (msqbuf.msg_qbytes > msqptr->msg_qbytes) {
420 error = suser(td);
421 if (error)
422 goto done2;
423 }
424 if (msqbuf.msg_qbytes > msginfo.msgmnb) {
425 DPRINTF(("can't increase msg_qbytes beyond %d"
426 "(truncating)\n", msginfo.msgmnb));

--- 12 unchanged lines hidden (view full) ---

439 msqptr->msg_ctime = time_second;
440 break;
441
442 case IPC_STAT:
443 if ((error = ipcperm(td, &msqptr->msg_perm, IPC_R))) {
444 DPRINTF(("requester doesn't have read access\n"));
445 goto done2;
446 }
446 error = copyout(msqptr, user_msqptr, sizeof(struct msqid_ds));
447 break;
448
449 default:
450 DPRINTF(("invalid command %d\n", cmd));
451 error = EINVAL;
452 goto done2;
453 }
454
455 if (error == 0)
456 td->td_retval[0] = rval;
457done2:
447 break;
448
449 default:
450 DPRINTF(("invalid command %d\n", cmd));
451 error = EINVAL;
452 goto done2;
453 }
454
455 if (error == 0)
456 td->td_retval[0] = rval;
457done2:
458 mtx_unlock(&Giant);
458 mtx_unlock(&msq_mtx);
459 if (cmd == IPC_STAT && error == 0)
460 error = copyout(msqptr, user_msqptr, sizeof(struct msqid_ds));
459 return(error);
460}
461
462#ifndef _SYS_SYSPROTO_H_
463struct msgget_args {
464 key_t key;
465 int msgflg;
466};

--- 13 unchanged lines hidden (view full) ---

480 struct ucred *cred = td->td_ucred;
481 register struct msqid_ds *msqptr = NULL;
482
483 DPRINTF(("msgget(0x%x, 0%o)\n", key, msgflg));
484
485 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
486 return (ENOSYS);
487
461 return(error);
462}
463
464#ifndef _SYS_SYSPROTO_H_
465struct msgget_args {
466 key_t key;
467 int msgflg;
468};

--- 13 unchanged lines hidden (view full) ---

482 struct ucred *cred = td->td_ucred;
483 register struct msqid_ds *msqptr = NULL;
484
485 DPRINTF(("msgget(0x%x, 0%o)\n", key, msgflg));
486
487 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
488 return (ENOSYS);
489
488 mtx_lock(&Giant);
490 mtx_lock(&msq_mtx);
489 if (key != IPC_PRIVATE) {
490 for (msqid = 0; msqid < msginfo.msgmni; msqid++) {
491 msqptr = &msqids[msqid];
492 if (msqptr->msg_qbytes != 0 &&
493 msqptr->msg_perm.key == key)
494 break;
495 }
496 if (msqid < msginfo.msgmni) {

--- 55 unchanged lines hidden (view full) ---

552 error = ENOENT;
553 goto done2;
554 }
555
556found:
557 /* Construct the unique msqid */
558 td->td_retval[0] = IXSEQ_TO_IPCID(msqid, msqptr->msg_perm);
559done2:
491 if (key != IPC_PRIVATE) {
492 for (msqid = 0; msqid < msginfo.msgmni; msqid++) {
493 msqptr = &msqids[msqid];
494 if (msqptr->msg_qbytes != 0 &&
495 msqptr->msg_perm.key == key)
496 break;
497 }
498 if (msqid < msginfo.msgmni) {

--- 55 unchanged lines hidden (view full) ---

554 error = ENOENT;
555 goto done2;
556 }
557
558found:
559 /* Construct the unique msqid */
560 td->td_retval[0] = IXSEQ_TO_IPCID(msqid, msqptr->msg_perm);
561done2:
560 mtx_unlock(&Giant);
562 mtx_unlock(&msq_mtx);
561 return (error);
562}
563
564#ifndef _SYS_SYSPROTO_H_
565struct msgsnd_args {
566 int msqid;
567 void *msgp;
568 size_t msgsz;

--- 18 unchanged lines hidden (view full) ---

587 register struct msg *msghdr;
588 short next;
589
590 DPRINTF(("call to msgsnd(%d, 0x%x, %d, %d)\n", msqid, user_msgp, msgsz,
591 msgflg));
592 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
593 return (ENOSYS);
594
563 return (error);
564}
565
566#ifndef _SYS_SYSPROTO_H_
567struct msgsnd_args {
568 int msqid;
569 void *msgp;
570 size_t msgsz;

--- 18 unchanged lines hidden (view full) ---

589 register struct msg *msghdr;
590 short next;
591
592 DPRINTF(("call to msgsnd(%d, 0x%x, %d, %d)\n", msqid, user_msgp, msgsz,
593 msgflg));
594 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
595 return (ENOSYS);
596
595 mtx_lock(&Giant);
597 mtx_lock(&msq_mtx);
596 msqid = IPCID_TO_IX(msqid);
597
598 if (msqid < 0 || msqid >= msginfo.msgmni) {
599 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid,
600 msginfo.msgmni));
601 error = EINVAL;
602 goto done2;
603 }

--- 65 unchanged lines hidden (view full) ---

669 } else {
670 /* Force later arrivals to wait for our
671 request */
672 DPRINTF(("we own the msqid_ds\n"));
673 msqptr->msg_perm.mode |= MSG_LOCKED;
674 we_own_it = 1;
675 }
676 DPRINTF(("goodnight\n"));
598 msqid = IPCID_TO_IX(msqid);
599
600 if (msqid < 0 || msqid >= msginfo.msgmni) {
601 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid,
602 msginfo.msgmni));
603 error = EINVAL;
604 goto done2;
605 }

--- 65 unchanged lines hidden (view full) ---

671 } else {
672 /* Force later arrivals to wait for our
673 request */
674 DPRINTF(("we own the msqid_ds\n"));
675 msqptr->msg_perm.mode |= MSG_LOCKED;
676 we_own_it = 1;
677 }
678 DPRINTF(("goodnight\n"));
677 error = tsleep(msqptr, (PZERO - 4) | PCATCH,
679 error = msleep(msqptr, &msq_mtx, (PZERO - 4) | PCATCH,
678 "msgwait", 0);
679 DPRINTF(("good morning, error=%d\n", error));
680 if (we_own_it)
681 msqptr->msg_perm.mode &= ~MSG_LOCKED;
682 if (error != 0) {
683 DPRINTF(("msgsnd: interrupted system call\n"));
684 error = EINTR;
685 goto done2;

--- 68 unchanged lines hidden (view full) ---

754 msghdr->msg_spot = next;
755 segs_needed--;
756 }
757
758 /*
759 * Copy in the message type
760 */
761
680 "msgwait", 0);
681 DPRINTF(("good morning, error=%d\n", error));
682 if (we_own_it)
683 msqptr->msg_perm.mode &= ~MSG_LOCKED;
684 if (error != 0) {
685 DPRINTF(("msgsnd: interrupted system call\n"));
686 error = EINTR;
687 goto done2;

--- 68 unchanged lines hidden (view full) ---

756 msghdr->msg_spot = next;
757 segs_needed--;
758 }
759
760 /*
761 * Copy in the message type
762 */
763
764 mtx_unlock(&msq_mtx);
762 if ((error = copyin(user_msgp, &msghdr->msg_type,
763 sizeof(msghdr->msg_type))) != 0) {
765 if ((error = copyin(user_msgp, &msghdr->msg_type,
766 sizeof(msghdr->msg_type))) != 0) {
767 mtx_lock(&msq_mtx);
764 DPRINTF(("error %d copying the message type\n", error));
765 msg_freehdr(msghdr);
766 msqptr->msg_perm.mode &= ~MSG_LOCKED;
767 wakeup(msqptr);
768 goto done2;
769 }
768 DPRINTF(("error %d copying the message type\n", error));
769 msg_freehdr(msghdr);
770 msqptr->msg_perm.mode &= ~MSG_LOCKED;
771 wakeup(msqptr);
772 goto done2;
773 }
774 mtx_lock(&msq_mtx);
770 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type);
771
772 /*
773 * Validate the message type
774 */
775
776 if (msghdr->msg_type < 1) {
777 msg_freehdr(msghdr);

--- 14 unchanged lines hidden (view full) ---

792 if (msgsz > msginfo.msgssz)
793 tlen = msginfo.msgssz;
794 else
795 tlen = msgsz;
796 if (next <= -1)
797 panic("next too low #2");
798 if (next >= msginfo.msgseg)
799 panic("next out of range #2");
775 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type);
776
777 /*
778 * Validate the message type
779 */
780
781 if (msghdr->msg_type < 1) {
782 msg_freehdr(msghdr);

--- 14 unchanged lines hidden (view full) ---

797 if (msgsz > msginfo.msgssz)
798 tlen = msginfo.msgssz;
799 else
800 tlen = msgsz;
801 if (next <= -1)
802 panic("next too low #2");
803 if (next >= msginfo.msgseg)
804 panic("next out of range #2");
805 mtx_unlock(&msq_mtx);
800 if ((error = copyin(user_msgp, &msgpool[next * msginfo.msgssz],
801 tlen)) != 0) {
806 if ((error = copyin(user_msgp, &msgpool[next * msginfo.msgssz],
807 tlen)) != 0) {
808 mtx_lock(&msq_mtx);
802 DPRINTF(("error %d copying in message segment\n",
803 error));
804 msg_freehdr(msghdr);
805 msqptr->msg_perm.mode &= ~MSG_LOCKED;
806 wakeup(msqptr);
807 goto done2;
808 }
809 DPRINTF(("error %d copying in message segment\n",
810 error));
811 msg_freehdr(msghdr);
812 msqptr->msg_perm.mode &= ~MSG_LOCKED;
813 wakeup(msqptr);
814 goto done2;
815 }
816 mtx_lock(&msq_mtx);
809 msgsz -= tlen;
810 user_msgp = (char *)user_msgp + tlen;
811 next = msgmaps[next].next;
812 }
813 if (next != -1)
814 panic("didn't use all the msg segments");
815
816 /*

--- 29 unchanged lines hidden (view full) ---

846 msqptr->msg_cbytes += msghdr->msg_ts;
847 msqptr->msg_qnum++;
848 msqptr->msg_lspid = td->td_proc->p_pid;
849 msqptr->msg_stime = time_second;
850
851 wakeup(msqptr);
852 td->td_retval[0] = 0;
853done2:
817 msgsz -= tlen;
818 user_msgp = (char *)user_msgp + tlen;
819 next = msgmaps[next].next;
820 }
821 if (next != -1)
822 panic("didn't use all the msg segments");
823
824 /*

--- 29 unchanged lines hidden (view full) ---

854 msqptr->msg_cbytes += msghdr->msg_ts;
855 msqptr->msg_qnum++;
856 msqptr->msg_lspid = td->td_proc->p_pid;
857 msqptr->msg_stime = time_second;
858
859 wakeup(msqptr);
860 td->td_retval[0] = 0;
861done2:
854 mtx_unlock(&Giant);
862 mtx_unlock(&msq_mtx);
855 return (error);
856}
857
858#ifndef _SYS_SYSPROTO_H_
859struct msgrcv_args {
860 int msqid;
861 void *msgp;
862 size_t msgsz;

--- 22 unchanged lines hidden (view full) ---

885 short next;
886
887 DPRINTF(("call to msgrcv(%d, 0x%x, %d, %ld, %d)\n", msqid, user_msgp,
888 msgsz, msgtyp, msgflg));
889
890 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
891 return (ENOSYS);
892
863 return (error);
864}
865
866#ifndef _SYS_SYSPROTO_H_
867struct msgrcv_args {
868 int msqid;
869 void *msgp;
870 size_t msgsz;

--- 22 unchanged lines hidden (view full) ---

893 short next;
894
895 DPRINTF(("call to msgrcv(%d, 0x%x, %d, %ld, %d)\n", msqid, user_msgp,
896 msgsz, msgtyp, msgflg));
897
898 if (!jail_sysvipc_allowed && jailed(td->td_ucred))
899 return (ENOSYS);
900
893 mtx_lock(&Giant);
894 msqid = IPCID_TO_IX(msqid);
895
896 if (msqid < 0 || msqid >= msginfo.msgmni) {
897 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid,
898 msginfo.msgmni));
901 msqid = IPCID_TO_IX(msqid);
902
903 if (msqid < 0 || msqid >= msginfo.msgmni) {
904 DPRINTF(("msqid (%d) out of range (0<=msqid<%d)\n", msqid,
905 msginfo.msgmni));
899 error = EINVAL;
900 goto done2;
906 return (EINVAL);
901 }
902
903 msqptr = &msqids[msqid];
907 }
908
909 msqptr = &msqids[msqid];
910 mtx_lock(&msq_mtx);
904 if (msqptr->msg_qbytes == 0) {
905 DPRINTF(("no such message queue id\n"));
906 error = EINVAL;
907 goto done2;
908 }
909 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) {
910 DPRINTF(("wrong sequence number\n"));
911 error = EINVAL;

--- 103 unchanged lines hidden (view full) ---

1015 goto done2;
1016 }
1017
1018 /*
1019 * Wait for something to happen
1020 */
1021
1022 DPRINTF(("msgrcv: goodnight\n"));
911 if (msqptr->msg_qbytes == 0) {
912 DPRINTF(("no such message queue id\n"));
913 error = EINVAL;
914 goto done2;
915 }
916 if (msqptr->msg_perm.seq != IPCID_TO_SEQ(uap->msqid)) {
917 DPRINTF(("wrong sequence number\n"));
918 error = EINVAL;

--- 103 unchanged lines hidden (view full) ---

1022 goto done2;
1023 }
1024
1025 /*
1026 * Wait for something to happen
1027 */
1028
1029 DPRINTF(("msgrcv: goodnight\n"));
1023 error = tsleep(msqptr, (PZERO - 4) | PCATCH, "msgwait", 0);
1030 error = msleep(msqptr, &msq_mtx, (PZERO - 4) | PCATCH,
1031 "msgwait", 0);
1024 DPRINTF(("msgrcv: good morning (error=%d)\n", error));
1025
1026 if (error != 0) {
1027 DPRINTF(("msgsnd: interrupted system call\n"));
1028 error = EINTR;
1029 goto done2;
1030 }
1031

--- 30 unchanged lines hidden (view full) ---

1062 msghdr->msg_ts));
1063 if (msgsz > msghdr->msg_ts)
1064 msgsz = msghdr->msg_ts;
1065
1066 /*
1067 * Return the type to the user.
1068 */
1069
1032 DPRINTF(("msgrcv: good morning (error=%d)\n", error));
1033
1034 if (error != 0) {
1035 DPRINTF(("msgsnd: interrupted system call\n"));
1036 error = EINTR;
1037 goto done2;
1038 }
1039

--- 30 unchanged lines hidden (view full) ---

1070 msghdr->msg_ts));
1071 if (msgsz > msghdr->msg_ts)
1072 msgsz = msghdr->msg_ts;
1073
1074 /*
1075 * Return the type to the user.
1076 */
1077
1078 mtx_unlock(&msq_mtx);
1070 error = copyout(&(msghdr->msg_type), user_msgp,
1071 sizeof(msghdr->msg_type));
1079 error = copyout(&(msghdr->msg_type), user_msgp,
1080 sizeof(msghdr->msg_type));
1081 mtx_lock(&msq_mtx);
1072 if (error != 0) {
1073 DPRINTF(("error (%d) copying out message type\n", error));
1074 msg_freehdr(msghdr);
1075 wakeup(msqptr);
1076 goto done2;
1077 }
1078 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type);
1079

--- 8 unchanged lines hidden (view full) ---

1088 if (msgsz - len > msginfo.msgssz)
1089 tlen = msginfo.msgssz;
1090 else
1091 tlen = msgsz - len;
1092 if (next <= -1)
1093 panic("next too low #3");
1094 if (next >= msginfo.msgseg)
1095 panic("next out of range #3");
1082 if (error != 0) {
1083 DPRINTF(("error (%d) copying out message type\n", error));
1084 msg_freehdr(msghdr);
1085 wakeup(msqptr);
1086 goto done2;
1087 }
1088 user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type);
1089

--- 8 unchanged lines hidden (view full) ---

1098 if (msgsz - len > msginfo.msgssz)
1099 tlen = msginfo.msgssz;
1100 else
1101 tlen = msgsz - len;
1102 if (next <= -1)
1103 panic("next too low #3");
1104 if (next >= msginfo.msgseg)
1105 panic("next out of range #3");
1106 mtx_unlock(&msq_mtx);
1096 error = copyout(&msgpool[next * msginfo.msgssz],
1097 user_msgp, tlen);
1107 error = copyout(&msgpool[next * msginfo.msgssz],
1108 user_msgp, tlen);
1109 mtx_lock(&msq_mtx);
1098 if (error != 0) {
1099 DPRINTF(("error (%d) copying out message segment\n",
1100 error));
1101 msg_freehdr(msghdr);
1102 wakeup(msqptr);
1103 goto done2;
1104 }
1105 user_msgp = (char *)user_msgp + tlen;
1106 next = msgmaps[next].next;
1107 }
1108
1109 /*
1110 * Done, return the actual number of bytes copied out.
1111 */
1112
1113 msg_freehdr(msghdr);
1114 wakeup(msqptr);
1115 td->td_retval[0] = msgsz;
1116done2:
1110 if (error != 0) {
1111 DPRINTF(("error (%d) copying out message segment\n",
1112 error));
1113 msg_freehdr(msghdr);
1114 wakeup(msqptr);
1115 goto done2;
1116 }
1117 user_msgp = (char *)user_msgp + tlen;
1118 next = msgmaps[next].next;
1119 }
1120
1121 /*
1122 * Done, return the actual number of bytes copied out.
1123 */
1124
1125 msg_freehdr(msghdr);
1126 wakeup(msqptr);
1127 td->td_retval[0] = msgsz;
1128done2:
1117 mtx_unlock(&Giant);
1129 mtx_unlock(&msq_mtx);
1118 return (error);
1119}
1120
1121static int
1122sysctl_msqids(SYSCTL_HANDLER_ARGS)
1123{
1124
1125 return (SYSCTL_OUT(req, msqids,

--- 12 unchanged lines hidden ---
1130 return (error);
1131}
1132
1133static int
1134sysctl_msqids(SYSCTL_HANDLER_ARGS)
1135{
1136
1137 return (SYSCTL_OUT(req, msqids,

--- 12 unchanged lines hidden ---