You're probably better than you think. Something that tripped me up for a long time (depending on your background, in my case I attribute it to being self taught but could be wrong), theres a huge difference between the academic side of things and the practical side.
You see people on here talking like "oh, you could implement a forward-signed dash dot this that array etc..." and I have no idea what they mean. Theres probably even a lot of more basic stuff which I don't understand. Maybe I should work on that more, but point is if you asked me to add a new feature into a codebase, I'd feel pretty confident doing that. From the sound of things, you could be in a very similar boat. Afterall, you're already doing the work.
Also, stop doing the overtime. Occasionally its fine, if it takes less effort to do it than fight it your usually alright, but that isn't your case at all.
You see people on here talking like "oh, you could implement a forward-signed dash dot this that array etc..." and I have no idea what they mean. Theres probably even a lot of more basic stuff which I don't understand. Maybe I should work on that more, but point is if you asked me to add a new feature into a codebase, I'd feel pretty confident doing that. From the sound of things, you could be in a very similar boat. Afterall, you're already doing the work.
Also, stop doing the overtime. Occasionally its fine, if it takes less effort to do it than fight it your usually alright, but that isn't your case at all.