steinar@fdmetd.uucp (Steinar Overbeck Cook) (08/18/89)
ORACLE (Pro*C) SENDS SIGNAL 15 (SIGTERM) TO THE APPLICATION --------------------------------------------------- Operating System: NCR UNIX 2.01 (which is System V.2 + a little V.3) Machine : NCR Tower/600 Oracle version : 5.1.17.4 We have had a severe problem with an application written in Pro*C. The problem being that SIGTERM was sent to our application at various points of execution. We have now tracked down the problem; when the length part of a host variable is too large, the run-time libraries of Pro*C sends a SIGTERM. The following fragment of code shows when it occurs: The interesting points are marked with '<<<<<<<<<<<'. . . . /* SQL stmt #7 EXEC SQL BEGIN DECLARE SECTION; */ struct { unsigned short len; unsigned char arr[20]; } get_version; /* VARCHAR get_version[20]; EXEC SQL END DECLARE SECTION; */ /* SQL stmt #18 EXEC SQL WHENEVER NOT FOUND CONTINUE; EXEC SQL SELECT kilde_versj_id, fysisk_versjon INTO :KV_kilde_versj_id:indicator_1, :KV_fysisk_versjon:indicator_2 FROM ops$uab.kilde_vers WHERE prosjekt_id = :P_prosjekt_id AND subsystem_id = :S_subsystem_id AND kilde_id = :K_kilde_id AND kilde_versj_id = :get_version; <<<<<<<----------- get_version.len is 233 which is 223 too large ! */ sqlsca(&sqlca); if ( !sqlusi[0] ) { /* OPEN SCOPE */ sq017.sq017T[0] = (unsigned short)10; SQLTM[0] = (int)4; sqlbs2(&sq017.sq017N, sq017.sq017V, sq017.sq017L, sq017.sq017T, sq017.sq017I, &SQLTM[0], &sqlusi[0]); } /* CLOSE SCOPE */ sqlsch(&sqlusi[0]); sqlscc(&sqlcun[4]); sqltfl(&SQLTM[0], &SQLBT0); if ( !SQLTM[0] ) { /* OPEN SCOPE */ SQLTM[0] = (int)16384; sqlopn(&SQLTM[0], &SQLBT3, &sqlvsn); SQLTM[0] = (int)143; sqlosq(sq018, &SQLTM[0]); } /* CLOSE SCOPE */ sq019.sq019V[0] = (unsigned char *)&P_prosjekt_id.len; sq019.sq019L[0] = (unsigned int)13; sq019.sq019T[0] = (unsigned short)9; sq019.sq019I[0] = (unsigned short *)0; sq019.sq019V[1] = (unsigned char *)&S_subsystem_id.len; sq019.sq019L[1] = (unsigned int)13; sq019.sq019T[1] = (unsigned short)9; sq019.sq019I[1] = (unsigned short *)0; sq019.sq019V[2] = (unsigned char *)&K_kilde_id.len; sq019.sq019L[2] = (unsigned int)17; sq019.sq019T[2] = (unsigned short)9; sq019.sq019I[2] = (unsigned short *)0; sq019.sq019V[3] = (unsigned char *)&get_version.len; sq019.sq019L[3] = (unsigned int)22; sq019.sq019T[3] = (unsigned short)9; sq019.sq019I[3] = (unsigned short *)0; sqlab2(&sq019.sq019N, sq019.sq019V, sq019.sq019L, sq019.sq019T, sq019.sq019I); SQLTM[0] = (int)1; sqlexe(&SQLTM[0]); <<<<<<========= THIS IS WHERE IT BLOWS UP !!!!! sq020.sq020V[0] = (unsigned char *)&KV_kilde_versj_id.len; sq020.sq020L[0] = (unsigned int)13; sq020.sq020T[0] = (unsigned short)9; sq020.sq020I[0] = (unsigned short *)&indicator_1; sq020.sq020V[1] = (unsigned char *)&KV_fysisk_versjon.len; sq020.sq020L[1] = (unsigned int)13; sq020.sq020T[1] = (unsigned short)9; sq020.sq020I[1] = (unsigned short *)&indicator_2; sqlad2(&sq020.sq020N, sq020.sq020V, sq020.sq020L, sq020.sq020T, sq020.sq020I); SQLTM[0] = (int)1; SQLTM[1] = (int)0; sqlfch(&SQLTM[0], &SQLTM[1]); SQLTM[0] = (int)1; SQLTM[1] = (int)1; sqlfch(&SQLTM[0], &SQLTM[1]); . . . . A look at the stack, reveals the following : call%(168792,173064,14672980) osnpgetmsg(168792,1,165204) osnpgetdatmsg(168792,173064,0) osnprc(165204,0,14673198) ttcdrv(14673184,0,168792) osnwat(165204,0,68360) upirtr(165148,4,14676024) upiexn(165148,7,1) sqlexe(156140,796226418,794911587) uab_get_file(uabf=0x2b40c,getmode=292) [uabget.c:1465] uabsp_main(uabf_block=0x2b40c) [uabsp.c:953] main(argc=2,argv=0xdffd50,14679388) [uabmain.c:386] In my humble opinion, I do think that ORACLE should document the fact that a SIGTERM is sent when ORACLE gets confused about lengths ! -- Steinar Overbeck Cook, Fellesdata a.s, P.O. Box 248, 0212 OSLO 2, NORWAY Phone : +47 2 52 80 80 Fax : +47 2 52 85 10 E-mail : ...!mcvax!ndosl!fdmetd!steinar or steinar@fdmetd.uucp <The opinions expressed, if any, do not represent Fellesdata a.s>