File tree Expand file tree Collapse file tree 1 file changed +23
-2
lines changed Expand file tree Collapse file tree 1 file changed +23
-2
lines changed Original file line number Diff line number Diff line change @@ -172,6 +172,14 @@ fn with_dirp<T>(d: &Option<~str>,
172
172
}
173
173
}
174
174
175
+ /// helper function that closes non-NULL files and then makes them NULL
176
+ priv unsafe fn fclose_and_null ( f : & mut * libc:: FILE ) {
177
+ if * f != 0 as * libc:: FILE {
178
+ libc:: fclose ( * f) ;
179
+ * f = 0 as * libc:: FILE ;
180
+ }
181
+ }
182
+
175
183
/**
176
184
* Spawns a process and waits for it to terminate
177
185
*
@@ -249,8 +257,8 @@ pub fn start_program(prog: &str, args: &[~str]) -> @Program {
249
257
fn destroy_repr ( r : & mut ProgRepr ) {
250
258
unsafe {
251
259
finish_repr ( & mut * r) ;
252
- libc :: fclose ( r. out_file ) ;
253
- libc :: fclose ( r. err_file ) ;
260
+ fclose_and_null ( & mut r. out_file ) ;
261
+ fclose_and_null ( & mut r. err_file ) ;
254
262
}
255
263
}
256
264
struct ProgRes {
@@ -507,6 +515,19 @@ mod tests {
507
515
assert ! ( status == 1 ) ;
508
516
}
509
517
518
+ #[ test]
519
+ pub fn test_destroy_once ( ) {
520
+ let mut p = run:: start_program ( "echo" , [ ] ) ;
521
+ p. destroy ( ) ; // this shouldn't crash (and nor should the destructor)
522
+ }
523
+
524
+ #[ test]
525
+ pub fn test_destroy_twice ( ) {
526
+ let mut p = run:: start_program ( "echo" , [ ] ) ;
527
+ p. destroy ( ) ; // this shouldnt crash...
528
+ p. destroy ( ) ; // ...and nor should this (and nor should the destructor)
529
+ }
530
+
510
531
}
511
532
512
533
// Local Variables:
You can’t perform that action at this time.
0 commit comments