Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f61d926

Browse files
committed
fix crash: null ptr in hls+
1 parent 5809c7c commit f61d926

12 files changed

+158
-10
lines changed

‎build/download‎

Lines changed: 0 additions & 1 deletion
This file was deleted.

‎hls/ngx_rtmp_hls_module.c‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,6 +2144,9 @@ ngx_rtmp_hls_video(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
21442144
ngx_log_error(NGX_LOG_ERR, s->log, 0,
21452145
"hls: error appending AUD NAL");
21462146
}
2147+
aud_sent = 1;
2148+
break;
2149+
21472150
case 9:
21482151
aud_sent = 1;
21492152
break;

‎http/ngx_http_flv_live_module.c‎

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ static void *ngx_http_flv_live_create_loc_conf(ngx_conf_t *cf);
2020
static char *ngx_http_flv_live_merge_loc_conf(ngx_conf_t *cf, void *parent,
2121
void *child);
2222

23-
static u_char ngx_flv_live_header[] = "FLV\x1\x50円0円0円\x90円0円0円0円";
23+
static u_char ngx_flv_live_audio_header[] = "FLV\x1\x10円0円0円\x90円0円0円0円";
24+
static u_char ngx_flv_live_video_header[] = "FLV\x1\x40円0円0円\x90円0円0円0円";
25+
static u_char ngx_flv_live_av_header[] = "FLV\x1\x50円0円0円\x90円0円0円0円";
2426

2527
static ngx_keyval_t ngx_http_flv_live_headers[] = {
2628
{ ngx_string("Cache-Control"), ngx_string("no-cache") },
@@ -41,6 +43,8 @@ typedef struct {
4143
ngx_str_t swf_url;
4244
ngx_str_t tc_url;
4345
ngx_str_t page_url;
46+
ngx_uint_t audio;
47+
ngx_uint_t video;
4448

4549
ngx_rtmp_addr_conf_t *addr_conf;
4650
} ngx_http_flv_live_loc_conf_t;
@@ -49,7 +53,7 @@ typedef struct {
4953
static ngx_command_t ngx_http_flv_live_commands[] = {
5054

5155
{ ngx_string("flv_live"),
52-
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
56+
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
5357
ngx_http_flv_live,
5458
NGX_HTTP_LOC_CONF_OFFSET,
5559
0,
@@ -97,11 +101,14 @@ ngx_http_flv_live_send_header(ngx_http_request_t *r)
97101
ngx_keyval_t *h;
98102
ngx_buf_t *b;
99103
ngx_chain_t out;
104+
ngx_http_flv_live_loc_conf_t *hflcf;
100105

101106
if (r->header_sent) {
102107
return NGX_OK;
103108
}
104109

110+
hflcf = ngx_http_get_module_loc_conf(r, ngx_http_flv_live_module);
111+
105112
r->headers_out.status = NGX_HTTP_OK;
106113
r->keepalive = 0; /* set Connection to closed */
107114

@@ -124,8 +131,32 @@ ngx_http_flv_live_send_header(ngx_http_request_t *r)
124131
return NGX_HTTP_INTERNAL_SERVER_ERROR;
125132
}
126133

127-
b->start = b->pos = ngx_flv_live_header;
128-
b->end = b->last = ngx_flv_live_header + sizeof(ngx_flv_live_header) - 1;
134+
switch (hflcf->audio | (hflcf->video < 1)) {
135+
case 1: // audio only
136+
b->start = b->pos = ngx_flv_live_audio_header;
137+
b->end = b->last = ngx_flv_live_audio_header +
138+
sizeof(ngx_flv_live_audio_header) - 1;
139+
break;
140+
141+
case 2: // video only
142+
b->start = b->pos = ngx_flv_live_video_header;
143+
b->end = b->last = ngx_flv_live_video_header +
144+
sizeof(ngx_flv_live_video_header) - 1;
145+
break;
146+
147+
case 3: // audio and video
148+
b->start = b->pos = ngx_flv_live_av_header;
149+
b->end = b->last = ngx_flv_live_av_header +
150+
sizeof(ngx_flv_live_av_header) - 1;
151+
break;
152+
153+
default:
154+
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
155+
"flv-live: send_header| av header config error.");
156+
157+
return NGX_HTTP_INTERNAL_SERVER_ERROR;
158+
}
159+
129160
b->memory = 1;
130161

131162
out.buf = b;
@@ -631,6 +662,7 @@ ngx_http_flv_live(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
631662
ngx_http_flv_live_loc_conf_t *hflcf;
632663
ngx_str_t *value, v;
633664
ngx_uint_t i;
665+
ngx_uint_t audio, video;
634666

635667
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
636668
clcf->handler = ngx_http_flv_live_handler;
@@ -644,15 +676,37 @@ ngx_http_flv_live(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
644676
return NGX_CONF_ERROR;
645677
}
646678

679+
audio = NGX_CONF_UNSET_UINT;
680+
video = NGX_CONF_UNSET_UINT;
681+
647682
for (i = 2; i < cf->args->nelts; ++i) {
648683
if (ngx_strncmp(value[i].data, "app=", 4) == 0) {
649684
v.data = value[i].data + 4;
650685
v.len = value[i].len - 4;
651686
hflcf->app = v;
687+
} else if (ngx_strncmp(value[i].data, "audio=", 6) == 0) {
688+
v.data = value[i].data + 6;
689+
v.len = value[i].len - 6;
690+
audio = ngx_atoi(v.data, v.len);
691+
} else if (ngx_strncmp(value[i].data, "video=", 6) == 0) {
692+
v.data = value[i].data + 6;
693+
v.len = value[i].len - 6;
694+
video = ngx_atoi(v.data, v.len);
652695
} else {
653696
return NGX_CONF_ERROR;
654697
}
655698
}
656699

700+
if (audio == NGX_CONF_UNSET_UINT) {
701+
audio = 1;
702+
}
703+
704+
if (video == NGX_CONF_UNSET_UINT) {
705+
video = 1;
706+
}
707+
708+
hflcf->audio = audio;
709+
hflcf->video = video;
710+
657711
return NGX_CONF_OK;
658712
}

‎mpegts/ngx_hls_live_module.c‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ ngx_hls_live_write_playlist(ngx_rtmp_session_t *s, ngx_buf_t *out,
246246
ngx_hls_live_app_conf_t *hacf;
247247

248248
ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);
249+
if (ctx == NULL) {
250+
ngx_log_error(NGX_LOG_ERR, s->log, 0, "hls-live: playlist| ctx is null");
251+
252+
return NGX_ERROR;
253+
}
249254

250255
ctx->last_time = time(NULL);
251256

@@ -788,6 +793,10 @@ ngx_hls_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
788793
ngx_del_timer(&ctx->ev);
789794
}
790795

796+
if (ctx->stream == NULL) {
797+
goto next;
798+
}
799+
791800
ngx_rtmp_fire_event(s, NGX_MPEGTS_MSG_CLOSE, NULL, NULL);
792801

793802
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,

‎mpegts/ngx_mpegts_live_module.c‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,9 @@ ngx_mpegts_live_h264_handler(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *f)
12801280
ngx_log_error(NGX_LOG_ERR, s->log, 0,
12811281
"mpegts-mux: h264_handler| error appending AUD NAL");
12821282
}
1283+
aud_sent = 1;
1284+
break;
1285+
12831286
case 9:
12841287
aud_sent = 1;
12851288
break;

‎ngx_live_record.c‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,9 @@ ngx_live_record_avc(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
10001000
ngx_log_error(NGX_LOG_ERR, s->log, 0,
10011001
"record: error appending AUD NAL");
10021002
}
1003+
aud_sent = 1;
1004+
break;
1005+
10031006
case 9:
10041007
aud_sent = 1;
10051008
break;

‎ngx_live_relay_static.c‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "ngx_map.h"
1111
#include "ngx_dynamic_conf.h"
1212
#include "ngx_rtmp_dynamic.h"
13-
13+
#include"ngx_dynamic_resolver.h"
1414

1515
static ngx_live_pull_pt next_pull;
1616

@@ -546,6 +546,8 @@ ngx_live_relay_pull(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
546546
return "invalid port";
547547
}
548548

549+
ngx_dynamic_resolver_add_domain(&url->url.host, cf->cycle);
550+
549551
continue;
550552
}
551553

‎ngx_rtmp_access_module.c‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,17 @@ ngx_rtmp_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
410410
break;
411411
}
412412

413+
rule = ngx_array_push(&ascf->rules);
414+
if (rule == NULL) {
415+
return NGX_CONF_ERROR;
416+
}
417+
418+
rule->mask = cidr.u.in.mask;
419+
rule->addr = cidr.u.in.addr;
420+
rule->deny = (value[0].data[0] == 'd') ? 1 : 0;
421+
rule->flags = flags;
422+
423+
break;
413424
/* "all" passes through */
414425
#endif
415426

‎ngx_rtmp_amf.c‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,10 @@ ngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,
330330
case NGX_DONE:
331331
if (elts->type & NGX_RTMP_AMF_OPTIONAL) {
332332
return NGX_OK;
333+
} else {
334+
return NGX_ERROR;
333335
}
336+
break;
334337
case NGX_ERROR:
335338
return NGX_ERROR;
336339
}
@@ -398,6 +401,13 @@ ngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,
398401
if (ngx_rtmp_amf_get(ctx, &max_index, 4) != NGX_OK) {
399402
return NGX_ERROR;
400403
}
404+
if (ngx_rtmp_amf_read_object(ctx, data,
405+
data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0
406+
) != NGX_OK)
407+
{
408+
return NGX_ERROR;
409+
}
410+
break;
401411

402412
case NGX_RTMP_AMF_OBJECT:
403413
if (ngx_rtmp_amf_read_object(ctx, data,
@@ -593,6 +603,15 @@ ngx_rtmp_amf_write(ngx_rtmp_amf_ctx_t *ctx,
593603
return NGX_ERROR;
594604
}
595605

606+
type8 = NGX_RTMP_AMF_END;
607+
if (ngx_rtmp_amf_write_object(ctx, data,
608+
elts[n].len / sizeof(ngx_rtmp_amf_elt_t)) != NGX_OK
609+
|| ngx_rtmp_amf_put(ctx, &type8, 1) != NGX_OK)
610+
{
611+
return NGX_ERROR;
612+
}
613+
break;
614+
596615
case NGX_RTMP_AMF_OBJECT:
597616
type8 = NGX_RTMP_AMF_END;
598617
if (ngx_rtmp_amf_write_object(ctx, data,

‎ngx_rtmp_eval.c‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,19 @@ ngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e, ngx_str_t *out,
154154

155155
name.len = p - name.data;
156156
ngx_rtmp_eval_append_var(ctx, &b, e, &name, log);
157+
switch (c) {
158+
case '$':
159+
name.data = p + 1;
160+
state = NAME;
161+
continue;
162+
case '\\':
163+
state = ESCAPE;
164+
continue;
165+
}
166+
167+
ngx_rtmp_eval_append(&b, &c, 1, log);
168+
state = NORMAL;
169+
break;
157170

158171
case NORMAL:
159172
switch (c) {
@@ -165,6 +178,9 @@ ngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e, ngx_str_t *out,
165178
state = ESCAPE;
166179
continue;
167180
}
181+
ngx_rtmp_eval_append(&b, &c, 1, log);
182+
state = NORMAL;
183+
break;
168184

169185
case ESCAPE:
170186
ngx_rtmp_eval_append(&b, &c, 1, log);

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /