static GstFlowReturn gst_srtp_dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf, gboolean is_rtcp) { GstSrtpDec *filter = GST_SRTP_DEC (parent); GstPad *otherpad; GstSrtpDecSsrcStream *stream = NULL; GstFlowReturn ret = GST_FLOW_OK; guint32 ssrc = 0; GST_OBJECT_LOCK (filter); /* Check if this stream exists, if not create a new stream */ if (!(stream = validate_buffer (filter, buf, &ssrc, &is_rtcp))) { GST_OBJECT_UNLOCK (filter); GST_WARNING_OBJECT (filter, "Invalid buffer, dropping"); goto drop_buffer; } if (!STREAM_HAS_CRYPTO (stream)) { GST_OBJECT_UNLOCK (filter); goto push_out; } if (!gst_srtp_dec_decode_buffer (filter, pad, buf, is_rtcp, ssrc)) { GST_OBJECT_UNLOCK (filter); goto drop_buffer; } GST_OBJECT_UNLOCK (filter); /* If all is well, we may have reached soft limit */ if (gst_srtp_get_soft_limit_reached ()) request_key_with_signal (filter, ssrc, SIGNAL_SOFT_LIMIT); push_out: /* Push buffer to source pad */ if (is_rtcp) { otherpad = filter->rtcp_srcpad; if (!filter->rtcp_has_segment) gst_srtp_dec_push_early_events (filter, filter->rtcp_srcpad, filter->rtp_srcpad, TRUE); } else { otherpad = filter->rtp_srcpad; if (!filter->rtp_has_segment) gst_srtp_dec_push_early_events (filter, filter->rtp_srcpad, filter->rtcp_srcpad, FALSE); } ret = gst_pad_push (otherpad, buf); return ret; drop_buffer: /* Drop buffer, except if gst_pad_push returned OK or an error */ gst_buffer_unref (buf); return ret; }
/* Reads a file into specified buffer and returns number of chars read or -1. */ static int syscall_read(int fd, void *buf, unsigned size) { int ret_val; struct fd_elem **fdt = thread_current()->open_files; /* Verify user supplied buffer is valid. */ validate_buffer(buf, size); if(fd == STDIN_FILENO) { /* Read from stdin. */ char *c = buf; while((void *) c < buf + size) *c++ = input_getc(); ret_val = size; } else if(fd >= 2 && fd < 128 && fdt[fd] != NULL) { /* If fd is valid, read from file. */ lock_acquire(&fs_lock); ret_val = file_read(fdt[fd]->file, buf, size); lock_release(&fs_lock); } else /* fd not valid. */ ret_val = -1; return ret_val; }
void add_numerals(char* result,size_t result_length, const char * first_numeral, const char * second_numeral) { if(!validate_buffer(result_length)) return; result[0] = '\0'; char first_numeral_substituted[MAX_NUMERAL_SIZE]; char second_numeral_substituted[MAX_NUMERAL_SIZE]; strcpy(first_numeral_substituted, first_numeral); strcpy(second_numeral_substituted, second_numeral); substitute_out_subtractives(first_numeral_substituted); substitute_out_subtractives(second_numeral_substituted); strcpy(result, first_numeral_substituted); strcat(result, second_numeral_substituted); sort_descending(result); combine_groups(result); substitute_in_subtractives(result); }
/* Writes a file into specified buffer and returns number of chars written or -1. */ static int syscall_write(int fd, void *buf, unsigned size){ int ret_val; struct fd_elem **fdt = thread_current()->open_files; /* Verify user supplied buffer is valid. */ validate_buffer(buf, size); if (fd == STDOUT_FILENO){ /* Write to stdout. */ putbuf(buf, size); ret_val = size; } else if (fd >= 2 && fd < 128 && fdt[fd] != NULL){ /* If fd is valid, read from file. */ lock_acquire(&fs_lock); ret_val = file_write(fdt[fd]->file, buf, size); lock_release(&fs_lock); } else /* fd not valid. */ ret_val = -1; return ret_val; }
static GstFlowReturn gst_srtp_dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf, gboolean is_rtcp) { GstSrtpDec *filter = GST_SRTP_DEC (parent); GstPad *otherpad; err_status_t err = err_status_ok; GstSrtpDecSsrcStream *stream = NULL; GstFlowReturn ret = GST_FLOW_OK; gint size; guint32 ssrc = 0; GstMapInfo map; GST_OBJECT_LOCK (filter); /* Check if this stream exists, if not create a new stream */ if (!(stream = validate_buffer (filter, buf, &ssrc, &is_rtcp))) { GST_OBJECT_UNLOCK (filter); GST_WARNING_OBJECT (filter, "Invalid buffer, dropping"); goto drop_buffer; } if (!STREAM_HAS_CRYPTO (stream)) { GST_OBJECT_UNLOCK (filter); goto push_out; } GST_LOG_OBJECT (pad, "Received %s buffer of size %" G_GSIZE_FORMAT " with SSRC = %u", is_rtcp ? "RTCP" : "RTP", gst_buffer_get_size (buf), ssrc); /* Change buffer to remove protection */ buf = gst_buffer_make_writable (buf); unprotect: gst_buffer_map (buf, &map, GST_MAP_READWRITE); size = map.size; gst_srtp_init_event_reporter (); if (is_rtcp) err = srtp_unprotect_rtcp (filter->session, map.data, &size); else { /* If ROC has changed, we know we need to set the initial RTP * sequence number too. */ if (filter->roc_changed) { srtp_stream_t stream; stream = srtp_get_stream (filter->session, htonl (ssrc)); if (stream) { guint16 seqnum = 0; GstRTPBuffer rtpbuf = GST_RTP_BUFFER_INIT; gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf); seqnum = gst_rtp_buffer_get_seq (&rtpbuf); gst_rtp_buffer_unmap (&rtpbuf); /* We finally add the RTP sequence number to the current * rollover counter. */ stream->rtp_rdbx.index &= ~0xFFFF; stream->rtp_rdbx.index |= seqnum; } filter->roc_changed = FALSE; } err = srtp_unprotect (filter->session, map.data, &size); } gst_buffer_unmap (buf, &map); GST_OBJECT_UNLOCK (filter); if (err != err_status_ok) { GST_WARNING_OBJECT (pad, "Unable to unprotect buffer (unprotect failed code %d)", err); /* Signal user depending on type of error */ switch (err) { case err_status_key_expired: GST_OBJECT_LOCK (filter); /* Update stream */ if (find_stream_by_ssrc (filter, ssrc)) { GST_OBJECT_UNLOCK (filter); if (request_key_with_signal (filter, ssrc, SIGNAL_HARD_LIMIT)) { GST_OBJECT_LOCK (filter); goto unprotect; } else { GST_WARNING_OBJECT (filter, "Hard limit reached, no new key, " "dropping"); } } else { GST_WARNING_OBJECT (filter, "Could not find matching stream, " "dropping"); } break; case err_status_auth_fail: GST_WARNING_OBJECT (filter, "Error authentication packet, dropping"); break; case err_status_cipher_fail: GST_WARNING_OBJECT (filter, "Error while decrypting packet, dropping"); break; default: GST_WARNING_OBJECT (filter, "Other error, dropping"); break; } goto drop_buffer; } gst_buffer_set_size (buf, size); /* If all is well, we may have reached soft limit */ if (gst_srtp_get_soft_limit_reached ()) request_key_with_signal (filter, ssrc, SIGNAL_SOFT_LIMIT); push_out: /* Push buffer to source pad */ if (is_rtcp) { otherpad = filter->rtcp_srcpad; if (!filter->rtcp_has_segment) gst_srtp_dec_push_early_events (filter, filter->rtcp_srcpad, filter->rtp_srcpad, TRUE); } else { otherpad = filter->rtp_srcpad; if (!filter->rtp_has_segment) gst_srtp_dec_push_early_events (filter, filter->rtp_srcpad, filter->rtcp_srcpad, FALSE); } ret = gst_pad_push (otherpad, buf); return ret; drop_buffer: /* Drop buffer, except if gst_pad_push returned OK or an error */ gst_buffer_unref (buf); return ret; }
void piglit_init(int argc, char **argv) { static const float uniform_data[4] = { 12.0, 0.5, 3.14169, 42.0 }; GLint vs; GLint fs; unsigned i; union data_blob buffer[16]; piglit_require_vertex_shader(); piglit_require_fragment_shader(); vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_text); fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_text); prog = piglit_link_simple_program(vs, fs); piglit_UseProgram(prog); base_location = piglit_GetUniformLocation(prog, "c"); if (base_location < 0) { printf("Could not get location of `c'.\n"); piglit_report_result(PIGLIT_FAIL); } for (i = 0; i < 4; i++) { char name[5]; name[0] = 'c'; name[1] = '['; name[2] = '0' + i; name[3] = ']'; name[4] = '\0'; array_location[i] = piglit_GetUniformLocation(prog, name); if (array_location[i] < 0) { printf("Could not get location of `%s'.\n", name); piglit_report_result(PIGLIT_FAIL); } } /* From page 80 of the OpenGL 2.1 spec: * * The first element of a uniform array is identified using the * name of the uniform array appended with "[0]". Except if the * last part of the string name indicates a uniform array, then * the location of the first element of that array can be * retrieved by either using the name of the uniform array, or the * name of the uniform array appended with "[0]". */ if (base_location != array_location[0]) { printf("Locations of `c' = %d and `c[0]' = %d, but they " "should be the same.\n", base_location, array_location[0]); piglit_report_result(PIGLIT_FAIL); } piglit_Uniform1fv(base_location, 4, uniform_data); /* From page 264 of the OpenGL 2.1 spec: * * In order to query the values of an array of uniforms, a * GetUniform* command needs to be issued for each array element. * * This means that querying using the location of 'array' is the same * as 'array[0]'. */ printf("Getting array element 0 from base location...\n"); for (i = 0; i < ARRAY_SIZE(buffer); i++) { buffer[i].u = 0xdeadbeef; } piglit_GetUniformfv(prog, base_location, (GLfloat *) buffer); validate_buffer(buffer, ARRAY_SIZE(buffer), uniform_data[0]); printf("Getting one array element at a time...\n"); for (i = 0; i < 4; i++) { unsigned j; for (j = 0; j < ARRAY_SIZE(buffer); j++) { buffer[j].u = 0xdeadbeef; } piglit_GetUniformfv(prog, array_location[i], (GLfloat *) buffer); validate_buffer(buffer, ARRAY_SIZE(buffer), uniform_data[i]); } piglit_report_result(PIGLIT_PASS); }